最近一段时间学习了不少新的技术,一方面是做做总结以免自己忘记,另一方面也想分享给有需要的网友。如有不足希望各位网友帮我斧正。
概述
自IOS7只有,苹果开放了新的UIViewController之间的转场动画,开发者可以实现诸多酷炫的跳转动画以及特殊的运行。本文主要先介绍UINavigation的非交互的自定义转场动画,其他扩展将在下一篇文章中进行介绍。
先来个简单的缩放转场效果图:
zoomTransition.gif进入正文:
在UINavigation的非交互的自定义转场动画中,苹果将此功能做成了一个协议UIViewControllerAnimatedTransitioning。
苹果官方对此协议的解释为:该协议中的方法允许您定义一个动画对象,该对象创建用于在一段固定的时间内将视图控制器转换为或关闭屏幕的动画。您使用此协议创建的动画不能是交互式的。要创建交互式转换,您必须将您的动画对象与控制动画时间的另一个对象相结合。
废话了那么多,直接开始代码第一步,创建NSObject类,来遵循UIViewControllerAnimatedTransitioning协议。
创建一个遵循UIViewControllerAnimatedTransitioning协议的NSObject类方框1:设置枚举类别,用于区别跳转的模式 方框2:遵循UIViewControllerAnimatedTransitioning协议
遵循协议之后我们需要在.m文件中写入两个协议中的方法。
方框1:这个方法主要是设置转场动画的时间,以及用于百分比驱动的交互转换,以及容器控制器(也就是可交互转场动画)
方框2:我们定义的转场动画都在此方法中实现。对此我们首先需要的是在transitionContext(转场控制器)中设置起始控制器和目的控制器。之后我们根据跳转模式将这两个控制器写入到transitionContext中。
方框3的方法如下:
方框3方法方框1中:是将起始和目的控制器添加到转场环境中,这里有一个视图的层级关系,insertSubView中的视图层级要比abvoeSubView中的要高,也就是说insertSubView的显示是在abvoeSubView上面的。
需要注意的是:当push和pop时,起始和目的控制器是相反的,所以网友在进行自定义动画的时候务必要搞清楚顺序,要不然会出现控制器销毁错误,程序黑屏的情况。建议不熟悉的网友可以NSLog打印出startViewController和endViewController,以便整理思路。
方框2中:[transitionContext transitionWasCancelled]方法用于判断当前的转场是否完成;[transitionContext completeTransition:]是当转场完成(或被取消)时,必须调用此方法。通常这是由对象符合UIViewControllerAnimatedTransitioning协议调用公开的过渡委托。对于纯粹的交互式转换,应该由交互控制器调用。这个方法有效地更新了内部视图转换结束时的控制器状态。否则程序crash。
将遵循UIViewControllerAnimatedTransitioning的类创建好之后,我们开始第二步:使用这个类。
这里需要注意的是,我们的navigation需要遵循UINavigationControllerDelegate协议,因为我们等下需要使用UINavigationControllerDelegate中的方法来返回我们的自定义动画。
在viewDidLoad中申明代理,由于转场动画冲突,会导致UINavigation自带的右滑返回上一层控制的手势失效,所以方框1是重新设置右滑返回的代理。
这个方法是UINavigationControllerDelegate中的代理方法,用于返回实现自定义转场动画。需要注意的是方框1,operation可以辨识push和pop跳转方式,所以我们需要提前判断,然后做出相对应的转场动画。方框2中,是在跳转时对起始和目的控制器做一下判断,这样做的好处是,当一个控制器有跳转到多个控制器功能且只对指定目的控制器有自定义转场动画时,避免其他不相干的控制器实现自定义转场功能。
需要注意的是:operation的push和pop状态,fromVC和toVC是相反的,希望注意,避免不必要的错误,同样各位也可以NSLog打印出来,以便更好的理解。
网友评论