场景转换是iOS开发中最基本的需求。为了让自己的App更加的酷炫,我们往往需要定制一些转场效果。在iOS中,可以通过多种方式设定转场效果。这里简单列表如下:
-
Modal presentation
-
设定ViewController的
modalTransitionStyle
属性。
这种方式也对应Storyboard中对应的segue transition的设置。这个属性是一个枚举类型,其值代表已经定制的几种转场风格。这种方式也是最简单的转场,不带有任何自定义的转场效果代码。 -
使用UIView的animation API实现自定义的动画。
这种方式是比较常见实现方式。除了官方的文档以外,大量的Blog文章都会详细讲解这些API的用法。UIView的animation API的使用比较直观,相对来说也是一种比较容易学习的动画实现方式。
-
设定ViewController的
-
Navigation View Controller presentation
-
使用UIView的animation API。
与Modal presentation相同,尽管在Storyboard中有专门为Navigation View Controller定制的Push segue(iOS8中被Show segue取代,因为后者支持iOS8中引进的Adaptive AutoLayout),但是Push segue并没有transtion属性,所以如果需要定制转场效果,可以使用UIVIew,使用方法和Modal presentation相同。 -
使用CATransition类。
CATransition
看起来更像为Navigation View Controller和TabBar View Controller这样的容器Controller定制的转场效果类。提供了很多内置的的动画效果。CATransition还可以结合CoreImage的滤镜CIFilter共同实现很炫的场景转换。若想详细了解CATransition的用法,可以读一读苹果的文档。
-
使用UIView的animation API。
我们注意到,转场往往发生在流程切换的时候。所以上面的转场效果代码,往往会放在自定义的转场方法中(多见于使用Nib开发)或放在自定义的UIStoryboardSegue类中(多见于使用Storyboard开发)。所以很多时候,我们往往会碰到原生的转场方法与定制的动画效果有一定冲突。因为像presentViewController:animated:completion:
这类方法本身就自带有内置的动画效果,自定义的动画效果往往在这个方法之外。所以很多时候需要用一些trick来避免这些问题。因此代码的可读性往往不会很好,并且写的不好的时候还会带来效率方面的问题。
iOS7以后,苹果引进了新的Transition API。这些API的使用方式,苹果没有给出一个官方的Guide,但是在网上,已经有很多Blog和教程讲解如何使用这些API,比如这篇文章。
新的Transition API完全改变了上面提到的动画与原生转场接口不兼容的问题。在新的API中,我们可以将动画效果代码单独封装到animator对象中,在设定好View Controller的transitoningDelegate后,再调用原生的转场方法,就会自动使用定制的动画效果。考虑到现在大部分App已经逐渐放弃了对iOS6的支持,所以这种方法是目前推荐的转场效果定制方法。单独封装的动画效果类在代码管理上也更加方便。
这里需要注意的一点,iOS6中引入的Storyboard Unwind Segue往往都需要一个Container View Controller。一个很常见的问题就是新手在定制Segue的时候往往会发生自定义的Unwind Segue不起作用。这个问题一般都是由于没有正确实现Container View Controller所需的方法带来的。我将在下篇文章讨论这个问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。