2016-09-30 88 views
2

我想實現一個自定義的塞格,它將從右向左帶動視圖控制器。問題是我的應用程序崩潰時,我按下按鈕,以執行segue到所需的控制器。我收到以下錯誤:與動畫從左到右的塞格

Could not create a segue of class '(null)'

我是如何實現它的? 我創建了一個新的類並覆蓋用下面的代碼的執行功能:

import UIKit 

class CustomTransition: UIStoryboardSegue { 

override func perform() 
{ 
    let src = self.source 
    let dst = self.destination 

    src.view.superview?.insertSubview(dst.view, aboveSubview: src.view) 
    dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0) 

    UIView.animate(withDuration: 0.25, 
           delay: 0.0, 
           options: UIViewAnimationOptions.curveEaseInOut, 
           animations: { 
           dst.view.transform = CGAffineTransform(translationX: 0, y: 0) 
     }, 
           completion: { finished in 
           src.present(dst, animated: false, completion: nil) 
     } 
    ) 
} 

}

以我的故事板我有一個UIButtoon我使用自定義賽格瑞並列(由我CustomTransition類生成的一個)。當我運行該應用程序並點擊按鈕時,我的應用程序崩潰與上面發佈的錯誤。我不明白爲什麼它會崩潰。我發現網上的每篇文章都與我實施它的方式類似。

回答

1

您是否嘗試不使用segues,但爲此轉換?

// create transition 
let transition = CATransition() 
transition.duration = 0.3 
// check other types 
transition.type = kCATransitionMoveIn 
// move from left 
transition.subtype = kCATransitionFromLeft 
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
navigationController.view.layer.addAnimation(transition, forKey: kCATransition) 
// push controller 
navigationController.pushViewController(controller, animated: false) 
+0

什麼是navigationController?你的sourceVC必須是UINavigationController嗎?如果源和目標只是兩個普通的UIViewControllers,就像原始問題一樣? – Cindeselia

+0

@Cindeselia你可以從屬性'sourceVC.navigationController'訪問導航控制器。 – Astoria

0

您可提取代碼的Segue公司類和故事板使用:

LeftToRightSegue.h:

@interface LeftToRightSegue : UIStoryboardSegue 

@end 

LeftToRightSegue.m

@implementation LeftToRightSegue 
-(void)perform 
{ 
    CATransition * transition = [CATransition new]; 
    transition.duration = 1; 
    transition.type = kCATransitionMoveIn; 
    transition.subtype = kCATransitionFromLeft; 
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    [self.sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 
    [self.sourceViewController.navigationController pushViewController:self.destinationViewController animated:false]; 
} 
@end