custom transition animation between UIViewControllers
iOS提供了一些基本的ViewController切换时的动画,可以满足基本的动画需求,但是显然不够玄,大多数我们都需要定制一些动画。类似的动画个人认为比较流畅且很平滑的有facebook的大图预览动画和sina weibo的大图预览动画,最近也在实现大图预览,研究了一些实现方法,现总结一下。
1.一般预览大图时都present modal controller,只是暂时中断之前的交互,可以方便的返回parent controller。这里使用modal controller最为简单,UIViewController 有两个属性 modalPresentationStyle 和 modalTransitionStyle,关于这两个属性我就不详细介绍,不了解的可以跳转 http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW67。首先将present controller 的modalPresentationStyle 设为UIModalPresentationCurrentContext,同时关闭系统动画 [self presentViewController:controller animated:NO completion:nil],这里我们要自定义动画,接着在presented view controller 的 viewDidAppear中将self.view的backgroundcolor设为透明,然后就可以运行我们自定义的动画,记住在动画结束后将背景颜色设为黑色。这样在动画的执行期间就可以看到presenting controller的view,使我们的动画看起来具有连续性。
2.第一种方法种的自定义切换动画有一定的局限性,就是只能用在modal controller中,所以必须为非modal controller 设计对应的动画机制。在网络上看到一种方法经过本人的试验是可行的,首先保存presenting controller的屏幕快照,然后将在presented controller中将之前的屏幕快照添加为self.view的subview,然后便可以运行我们自定义的动画了,这样也可以保证controller的切换自然和流畅,只是当presentting controller的view层次结构较为复杂时,可能获取屏幕快照的时间较长,导致一定的时延。我这里的结构就相对复杂,经粗略测试,获取屏幕快照的时间为500ms,感觉很明显。所以这种方法不是很推荐。
3.考虑到第二种方法虽然具有普适性,但是存在很大的性能问题,不够流畅和顺滑。因此,这里又设计了另外一种机制,但是未经验证,不过应该没有问题,跟第二种很接近,但是有所不同,第二种方法时间主要花在了获取屏幕快照上,其实这么做就是为了在显示presented controller时,同时显示presenting controller,以实现动画的延续性。那这里咱们不去获取屏幕快照,只是返回presenting controller的self.view,然后将presenting controller返回的view作为presented controller的subview,这样效率会高很多,同时也实现了动画的连续性。
综上所述,第一种方法最为简单,但是有一定的局限性,第二种稍微复杂,第三种非常灵活,适应性很强,可以应用各种场景。因此,诸位可以根据需要选择不同的场景。