2016-03-03 61 views
0

我有一個問題,創建一個自定義賽格瑞:我重寫「執行()」方法如下定製UIStoryboardSegue - UIViewController的supportedInterfaceOrientations永遠不會調用

override func perform() { 
    if !isBack { 
     self.destinationViewController.view.frame = CGRectMake(self.sourceViewController.view.frame.width, 0, self.sourceViewController.view.frame.width, self.sourceViewController.view.frame.height) 
     self.sourceViewController.view.addSubview(self.destinationViewController.view) 
     self.sourceViewController.addChildViewController(self.destinationViewController) 
     print("Source: \(self.sourceViewController) ---> Destination: \(self.destinationViewController)") 
     UIView.animateWithDuration(0.5, animations: {() -> Void in 
      self.destinationViewController.view.frame = CGRectMake(0, 0, self.destinationViewController.view.frame.width, self.destinationViewController.view.frame.height) 
      }, completion: { (bolean) -> Void in 
       print("Animation Completed") 
     }) 

    }else{ 
     print("Source: \(self.sourceViewController) ---> Destination: \(self.destinationViewController)") 
     UIView.animateWithDuration(0.5, animations: {() -> Void in 
      self.sourceViewController.view.frame = CGRectMake(self.sourceViewController.view.frame.width, 0, self.sourceViewController.view.frame.width, self.sourceViewController.view.frame.height) 
      }, completion: { (bolean) -> Void in 
       print("Animation Completed") 

       self.sourceViewController.view.removeFromSuperview() 
     }) 
    } 

一切都正常運行,但是,在這一點上,旋轉「destinationViewController」中的方法沒有被調用。因此,如果我將「sourceViewController」鎖定爲縱向模式,而將「destinationViewController」解鎖,則後者不會旋轉。

假設問題出現在這一行: self.sourceViewController.view.addSubview(self.destinationViewController.view) 我該如何更改代碼來修復旋轉?

+0

除了打印出日誌消息之外,這個自定義segue是做什麼的,標準'push' segue不會這樣做? AFAICT,當導航到目標視圖控制器時,它將從右側滑動,而在返回時則會從右側滑動。 – NRitH

+0

好吧,這只是一個動畫的例子,如果我想創建一個最複雜的推動或模態動畫? – Eloreden

回答

0

好男人我找到了這樣的解決方案。

override func perform() { 
    if !isBack { 
     self.destinationViewController.view.frame = CGRectMake(self.sourceViewController.view.frame.width, 0, self.sourceViewController.view.frame.width, self.sourceViewController.view.frame.height) 

     let window = UIApplication.sharedApplication().keyWindow 
     window?.insertSubview(self.destinationViewController.view, aboveSubview: self.sourceViewController.view) 

     print("Source: \(self.sourceViewController) ---> Destination: \(self.destinationViewController)") 
     UIView.animateWithDuration(0.5, animations: {() -> Void in 
      self.destinationViewController.view.frame = CGRectMake(0, 0, self.destinationViewController.view.frame.width, self.destinationViewController.view.frame.height) 
      }, completion: { (bolean) -> Void in 
       print("Animazione Terminata") 
       self.sourceViewController.presentViewController(self.destinationViewController, animated: false, completion: nil) 
     }) 

    }else{ 
     print("Indietro Source: \(self.sourceViewController) ---> Destination: \(self.destinationViewController)") 

     let snapshot = self.sourceViewController.view.snapshotViewAfterScreenUpdates(false) 
     snapshot.frame = CGRectMake(0, 0, snapshot.frame.size.width, snapshot.frame.size.height) 
     self.destinationViewController.view.addSubview(snapshot) 
     self.sourceViewController.dismissViewControllerAnimated(false, completion: nil) 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      UIView.animateWithDuration(0.5, animations: {() -> Void in 
       snapshot.frame = CGRectMake(self.destinationViewController.view.frame.width, 0, self.destinationViewController.view.frame.width, self.destinationViewController.view.frame.height) 
       }, completion: { (bolean) -> Void in 
        print("Animazione Terminata") 
        snapshot.removeFromSuperview() 
      }) 
     }) 
    } 
} 

我明白,UIStoryboar在最後做像演示文稿一樣的操作。所以在你創建動畫之前,然後呈現。當你需要關閉之前得到一個沒有動畫的屏幕關閉源VC的快照(在關閉之前在目標VC中添加快照)並最終爲該快照創建動畫。

tnx和buy。

對不起我的壞英語,但談話是芯片我顯示的代碼。

編輯:在我的代碼中有一個litle不精確。爲了防止動畫簡單地設置在目前的問題o解除您的動畫complanion。

相關問題