iOS中的转场研究(1)

场景转换是iOS开发中最基本的需求。为了让自己的App更加的酷炫,我们往往需要定制一些转场效果。在iOS中,可以通过多种方式设定转场效果。这里简单列表如下:

  • Modal presentation

    1. 设定ViewController的modalTransitionStyle属性。
      这种方式也对应Storyboard中对应的segue transition的设置。这个属性是一个枚举类型,其值代表已经定制的几种转场风格。这种方式也是最简单的转场,不带有任何自定义的转场效果代码。
    2. 使用UIView的animation API实现自定义的动画。
      这种方式是比较常见实现方式。除了官方的文档以外,大量的Blog文章都会详细讲解这些API的用法。UIView的animation API的使用比较直观,相对来说也是一种比较容易学习的动画实现方式。
  • Navigation View Controller presentation

    1. 使用UIView的animation API。
      与Modal presentation相同,尽管在Storyboard中有专门为Navigation View Controller定制的Push segue(iOS8中被Show segue取代,因为后者支持iOS8中引进的Adaptive AutoLayout),但是Push segue并没有transtion属性,所以如果需要定制转场效果,可以使用UIVIew,使用方法和Modal presentation相同。
    2. 使用CATransition类。
      CATransition看起来更像为Navigation View Controller和TabBar View Controller这样的容器Controller定制的转场效果类。提供了很多内置的的动画效果。CATransition还可以结合CoreImage的滤镜CIFilter共同实现很炫的场景转换。若想详细了解CATransition的用法,可以读一读苹果的文档

我们注意到,转场往往发生在流程切换的时候。所以上面的转场效果代码,往往会放在自定义的转场方法中(多见于使用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所需的方法带来的。我将在下篇文章讨论这个问题。

    原文作者:kid143
    原文地址: https://segmentfault.com/a/1190000000777787
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞