更新,更简单的自定义转场集成!
写在前面
这两天闲下来好好的研究了一下自定义转场,关于这方面的文章网络上已经很多了,作为新手,我想通过这篇文章把自己这几天的相关学习心得记录一下,方便加深印响和以后的回顾,这是我第一写技术文章,不好之处请谅解,通过这几天的学习,我尝试实现了四个效果,废话不多说,先上效果图:
DEMO ONE:一个弹性的present动画,支持手势present和dismiss
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切换,我想把整个自定义转场的步骤做个总结:
- 我们需要自定义一个遵循的
协议的动画过渡管理对象,并实现两个必须实现的方法:
1234//返回动画事件- (NSTimeInterval)transitionDuration:(nullable id )transitionContext;//所有的过渡动画事务都在这个方法里面完成- (void)animateTransition:(id )transitionContext; - 我们还需要自定义一个继承于
UIPercentDrivenInteractiveTransition
的手势过渡管理对象,我把它成为百分比手势过渡管理对象,因为动画的过程是通过百分比控制的 - 成为相应的代理,实现相应的代理方法,返回我们前两步自定义的对象就OK了 !模态推送需要实现如下4个代理方法,iOS8新的那个方法我暂时还没有发现它的用处,所以暂不讨论
12345678//返回一个管理prenent动画过渡的对象- (nullable id )animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;//返回一个管理pop动画过渡的对象- (nullable id )animationControllerForDismissedController:(UIViewController *)dismissed;//返回一个管理prenent手势过渡的对象- (nullable id )interactionControllerForPresentation:(id )animator;//返回一个管理pop动画过渡的对象- (nullable id )interactionControllerForDismissal:(id )animator;
导航控制器实现如下2个代理方法
12345678//返回转场动画过渡管理对象- (nullable id )navigationController:(UINavigationController *)navigationControllerinteractionControllerForAnimationController:(id ) animationController NS_AVAILABLE_IOS(7_0);//返回手势过渡管理对象- (nullable id )navigationController:(UINavigationController *)navigationControlleranimationControllerForOperation:(UINavigationControllerOperation)operationfromViewController:(UIViewController *)fromVCtoViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0);
标签控制器也有相应的两个方法
1234567//返回转场动画过渡管理对象- (nullable id )tabBarController:(UITabBarController *)tabBarControllerinteractionControllerForAnimationController: (id )animationController NS_AVAILABLE_IOS(7_0);//返回手势过渡管理对象- (nullable id )tabBarController:(UITabBarController *)tabBarControlleranimationControllerForTransitionFromViewController:(UIViewController *)fromVCtoViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0); - 如果看着这些常常的代理方法名头疼的话,没关系,先在demo中用起来吧,慢慢就习惯了,其实哪种自定义转场都只需要这3个步骤,如果不需要手势控制,步骤2还可以取消,现在就让我们动手来实现效果吧
动手吧!
demo one
1、我们首先创建2个控制器,为了方便我称做present操作的为vc1、被present的为vc2,点击一个控制器上的按钮可以push出另一个控制器
2、 然后我们创建一个过渡动画管理的类,遵循协议,我这里是
XWPresentOneTransition
,由于我们要同时管理present和dismiss2个动画,你可以实现相应的两个类分别管理两个动画,但是我觉得用一个类来管理就好了,看着比较舒服,逻辑也比较紧密,因为present和dismiss的动画逻辑很类似,写在一起,可以相互参考,所以我定义了一个枚举和两个初始化方法:
1 2 3 4 5 6 7 8 9 10 11 |
XWPresentOneTransition.h typedef NS_ENUM(NSUInteger, XWPresentOneTransitionType) { XWPresentOneTransitionTypePresent = 0,//管理present动画 XWPresentOneTransitionTypeDismiss//管理dismiss动画 }; 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切换,我想把整个自定义转场的步骤做个总结:
动手吧!demo one1、我们首先创建2个控制器,为了方便我称做present操作的为vc1、被present的为vc2,点击一个控制器上的按钮可以push出另一个控制器
|