自定义iOS View Controller过渡

查看/下载该项目的源代码

是否曾经想过在View Controller过渡中添加一些“ pezaz”? 确保内置的过渡看起来还可以,但是有时候您想要的东西会让您的用户充满过渡的喜悦。 在这篇简短的文章中,我们将要做到这一点。 我们开工吧。


主要玩家

我可以向您介绍一下本课程中的精英球员群体:

UIViewControllerTransitioningDelegate

我们将遵循此协议,以允许我们使用自定义过渡:我们可以按字面上设计我们想要的任何过渡! 谈论:

UIViewControllerAnimatedTransitioning

这个坏男孩将使我们能够为View Controller设计完全rad和自定义的过渡! 怎么了 是的


鸡休息

那么这里需要什么方法? 好吧,在这种情况下,我发现所需的方法确实非常有用且合乎逻辑。

例如,在UIViewControllerTransitioningDelegate中,我们需要添加以下方法:

animationController(forPresented)和animationController(forDismissed)—实际上,我们需要在动画呈现视图时和何时关闭视图时调用一些东西。

类似地,当遵循UIViewControllerAnimatedTransitioning时,我们将使用:

transitionDuration()和animateTransition(using)-在这里,我们提供了过渡的持续时间(显而易见的)以及实际的动画。

让我们开始

开始一个新项目,并为过渡创建一个新的Swift文件。 在其中,我们将从NSObject继承以开始,然后遵循AnimatedTransitiong:

 类CewlAnimation:NSObject,UIViewControllerAnimatedTransitioning {
 } 

在这里,您将需要两种方法来使过渡正常工作:

  func transitionDuration(使用transitionContext:UIViewControllerContextTransitioning?)-> TimeInterval {返回1.0 //只要您喜欢就可以:-D} fanimanimateTransition(使用transitionContext:UIViewControllerContextTransitioning){
 //动画Meh!} 

太棒了! 让我们添加一些动画。

  func animateTransition(使用transitionContext:UIViewControllerContextTransitioning){让containerView = transitionContext.containerViewlet toView = transitionContext.view(forKey:.to)toView?.transform = CGAffineTransform(scaleX:0.0,y:0.0)containerView.addSubview(toView!)containerView。带子视图(toFront:toView!)UIView.animate(withDuration:1.0,动画:{toView?.transform = .identity})transitionContext.completeTransition(true)} 

哇! 那是很多代码。 在基本级别上,这将在视图之间进行1秒钟的过渡,并在其中进行缩放以从中心填充屏幕。

让我们将代码分解为可咀嚼的内容:

当您执行这些自定义转换时,会出现一个超级有用的“事物”,称为transitionContext。 这就像两个视图之间的切换管理器一样,它使您可以访问要“到达”和“来自”视图。

要获得对“经理”的引用,请使用:

 让containerView = transitionContext.containerView 

这使您可以引用我们要移至的视图:

 让toView = transitionContext.view(forKey:.to) 

然后,我们为过渡设置动画:请记住,在制作动画时,我们要设置要从哪里开始 ,然后动画该状态。

  toView?.transform = CGAffineTransform(scaleX:0.0,y:0.0)//再见视图,您现在不可见 

然后,我们将其添加到视图层次结构中并将其放置在堆栈顶部:

  containerView.addSubview(toView!)containerView.bringSubview(toFront:toView!) 

现在,我们在堆栈顶部有了一个不可见的视图,需要将其实际动画化到屏幕上:

  UIView.animate(withDuration:1.0,动画:{toView?.transform = .identity}) 

很酷,但不要忘了通知“经理”过渡已完成,否则将永远不会结束!

  transitionContext.completeTransition(true) 

太棒了,现在我们只需要几个视图即可在它们之间进行转换!

转到主ViewController类,并确保您符合UIViewControllerTransitioningDelegate

 扩展ViewController:UIViewControllerTransitioningDelegate {func animationController(forPresented提出:UIViewController,提出:UIViewController,来源:UIViewController)-> UIViewControllerAnimatedTransitioning?  {return nil} func animationController(forDismissed已解雇:UIViewController)-> UIViewControllerAnimatedTransitioning?  {return nil}} 

您会注意到我们在这里返回nil,让我们添加新的动画!

 类ViewController:UIViewController {让cewlAnimation = CewlAnimation()... 

是! 在此过渡过程中,我们拥有哪些翔实的名称。 现在,只需更改方法以返回过渡即可,而不是nil:

 扩展ViewController:UIViewControllerTransitioningDelegate {func animationController(forPresented提出:UIViewController,提出:UIViewController,来源:UIViewController)-> UIViewControllerAnimatedTransitioning?  {return cewlAnimation //  UIViewControllerAnimatedTransitioning?  {return nil}} 

优秀! 现在创建一个新的ViewController和一个名为DetailView的类。 也将标识符添加到情节提要中。 确保新的View Controller也符合过渡协议:

 类DetailController:UIViewController,UIViewControllerTransitioningDelegate {
 ... 

现在创建一个按钮,并向其添加一个操作以过渡到另一个ViewController:

  @IBAction func loadVCInStyle(_ sender:Any){让detailView =故事板!.instantiateViewController(withIdentifier:“ DetailView”)为!  DetailControllerdetailView.transitioningDelegate = selfpresent(detailView,动画:true,完成:nil)} 

注意,我们正在将委托设置为我们的ViewController。

构建并运行! 哇! 多么好的动画。 玩得开心!