从左到右使用动画进行 Segue

Posted

技术标签:

【中文标题】从左到右使用动画进行 Segue【英文标题】:Segue with animation from left to right 【发布时间】: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 类生成的那个)绑定它。当我运行应用程序并点击按钮时,我的应用程序崩溃并出现上面发布的错误。我不明白为什么它会崩溃。我在网上找到的每一篇文章都与我实现它的方式相似。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于从左到右使用动画进行 Segue的主要内容,如果未能解决你的问题,请参考以下文章

jQuery从左到右连续动画图像? [关闭]

UIImageView 动画从左到右

UIImageView从左到右改变动画

从左到右平滑地重复动画

Android 从左到右滑动动画

核心动画从左到右