【问题标题】:Segue with animation from left to right从左到右使用动画进行 Segue
【发布时间】:2016-09-30 10:55:27
【问题描述】:

我正在尝试实现一个自定义 segue,它将带动画的视图控制器从右到左。问题是当我按下按钮以执行对所需控制器的 segue 时,我的应用程序崩溃了。我收到以下错误:

无法创建类 '(null)' 的转场

我是如何实现它的? 我创建了一个新类并使用以下代码覆盖了 perform 函数:

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)
        }
    )
}

}

在我的故事板中,我有一个 UIButton,我使用自定义 segue(由我的 CustomTransition 类生成的那个)绑定它。当我运行应用程序并点击按钮时,我的应用程序崩溃并出现上面发布的错误。我不明白为什么它会崩溃。我在网上找到的每一篇文章都与我实现它的方式相似。

【问题讨论】:

    标签: ios xcode segue swift3 uistoryboardsegue


    【解决方案1】:

    您是否尝试不使用 segue 而使用转换来达到此目的?

    // 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)
    

    【讨论】:

    • 什么是导航控制器?您的 sourceVC 是否必须是 UINavigationController?如果源和目标只是原始问题中的两个常规 UIViewController 怎么办?
    • @Cindeselia 您可以从属性sourceVC.navigationController 访问导航控制器。
    【解决方案2】:

    您可以将该代码提取到 Segue 类并在 Storyboard 上使用:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-07
      • 2012-04-07
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      相关资源
      最近更新 更多