iOS自定义转场动画

更新,更简单的自定义转场集成!

几句代码快速集成自定义转场效果+ 全手势驱动

写在前面

这两天闲下来好好的研究了一下自定义转场,关于这方面的文章网络上已经很多了,作为新手,我想通过这篇文章把自己这几天的相关学习心得记录一下,方便加深印响和以后的回顾,这是我第一写技术文章,不好之处请谅解,通过这几天的学习,我尝试实现了四个效果,废话不多说,先上效果图:

DEMO ONE:一个弹性的present动画,支持手势present和dismiss

弹性pop

DEMO TWO:一个类似于KeyNote的神奇移动效果push动画,支持手势pop

神奇移动

DEMO THREE:一个翻页push效果,支持手势PUSH和POP

翻页效果

DEMO FOUR:一个小圆点扩散present效果,支持手势dimiss

扩散效果

动手前

大家都知道从iOS7开始,苹果就提供了自定义转场的API,模态推送present和dismiss、导航控制器push和pop、标签控制器的控制器切换都可以自定义转场了,关于过多的理论我就不太多说明了,大家可以先参照onevcat大神的这篇博客:WWDC 2013 Session笔记 – iOS7中的ViewController切换,我想把整个自定义转场的步骤做个总结:

  1. 我们需要自定义一个遵循的协议的动画过渡管理对象,并实现两个必须实现的方法:
  2. 我们还需要自定义一个继承于UIPercentDrivenInteractiveTransition的手势过渡管理对象,我把它成为百分比手势过渡管理对象,因为动画的过程是通过百分比控制的
  3. 成为相应的代理,实现相应的代理方法,返回我们前两步自定义的对象就OK了 !模态推送需要实现如下4个代理方法,iOS8新的那个方法我暂时还没有发现它的用处,所以暂不讨论

    导航控制器实现如下2个代理方法

    标签控制器也有相应的两个方法
  4. 如果看着这些常常的代理方法名头疼的话,没关系,先在demo中用起来吧,慢慢就习惯了,其实哪种自定义转场都只需要这3个步骤,如果不需要手势控制,步骤2还可以取消,现在就让我们动手来实现效果吧

动手吧!

demo one

1、我们首先创建2个控制器,为了方便我称做present操作的为vc1、被present的为vc2,点击一个控制器上的按钮可以push出另一个控制器
2、 然后我们创建一个过渡动画管理的类,遵循协议,我这里是XWPresentOneTransition,由于我们要同时管理present和dismiss2个动画,你可以实现相应的两个类分别管理两个动画,但是我觉得用一个类来管理就好了,看着比较舒服,逻辑也比较紧密,因为present和dismiss的动画逻辑很类似,写在一起,可以相互参考,所以我定义了一个枚举和两个初始化方法:

3、 然后再.m文件里面实现必须实现的两个代理方法

4、 设置vc2的transitioningDelegate,我就设为它自己咯,我实在vc2的init方法中设置的,并实现代理方法

5、 至此我们所有的准备工作就做好了,下面只需要专心在presentAnimation:方法和dismissAnimation方法中实现动画逻辑就OK了,先看presentAnimation:

再看dismissAnimation 方法

6、如果不需要手势控制,这个转场就算完成了,下面我们来添加手势,首先创建一个手势过渡管理的类,我这里是XWInteractiveTransition,因为无论哪一种转场,手势控制的实质都是一样的,我干脆就把这个手势过渡管理的类封装了一下,具体可以在.h文件里面查看,在接下来的三个转场效果中我们都可以便捷的是使用它 .m文件说明

7、 手势过渡管理者就算完毕了,这个手势管理者可以用到其他任何的模态和导航控制器转场中,以后都不用在写了,现在把他用起来,在vc2和vc1中创建相应的手势过渡管理者,并放到相应的代理方法去返回它

8、 终于完成了,再来看一下效果,是不是还不错!

弹性pop

DEMO TWO

1、 创建动画过渡管理者的代码就不重复说明了,我仿造demo1,利用枚举创建了一个同时管理push和pop的管理者,然后动画的逻辑代码集中在doPushAnimationdoPopAnimation中,很多内容都在demo1中说明了,下面的注释就比较简单了,来看看

2、 然后将这个动画过渡管理者和demo1中创建的手势过渡管理者分别放到正确的代理方法中,用起来就可以了

神奇移动

DEMO THREE

1、 直接看看doPushAnimationdoPopAnimation的动画逻辑,这次使用了CAGradientLayer给动画的过程增加了阴影

2、 最后用上去在加上手势就是这个样子啦

翻页效果

DEMO FOUR

1、 直接看看doPresentAnimationdoDismissAnimation的动画逻辑,这次使用了CASharpLayer和UIBezierPath

2、最后在animationDidStop的代理方法中处理到动画的完成逻辑,处理方式都类似

3、 最后用上去在加上手势就是这个样子啦

扩散效果

总结

1、关于:self.modalPresentationStyle = UIModalPresentationCustom;我查看了视图层级后发现,如果使用了Custom,在present动画完成的时候,presentingView也就是demo one中的vc1的view会从containerView中移除,只是移除,并未销毁,此时还被持有着(dismiss后还得回来呢!),如果设置custom,那么present完成后,它一直都在containerView中,只是在最后面,所以需不需要设置custom可以看动画完成后的情况,是否还需要看见presentingViewController,但是记住如果没有设置custom,在disMiss的动画逻辑中,要把它加回containerView中,不然就不在咯~!
2、感觉写了好多东西,其实只要弄懂了转场的逻辑,其实就只需要写动画的逻辑就行了,其他东西都是固定的,而且苹果提供的这种控制转场的方式可充分解耦,除了写的手势过渡管理可以拿到任何地方使用,所有的动画过渡管理者都可以很轻松的复用到其他转场中,都不用分是何种转场,demo没有写标签控制器的转场,实现方法也是完全类似的,大家可以尝试一下,四个demo的github地址:自定义转场动画demo

1 7 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部