本文记录分享下自定义转场动画的实现方法,具体到动画效果:新浪微博图集浏览转场效果、手势过渡动画、网易音乐启动屏转场动画、开关门动画、全屏侧滑返回效果 的代码可以到Github WSLTransferAnimation下载查看,注释还算清晰。
###模态化present和dismiss 自定义转场
1、创建一个遵循
1 | //返回动画事件 |
2、自定义一个继承于UIPercentDrivenInteractiveTransition的手势过渡管理对象,可以根据手势需要设置控制动画转场进度的百分比。1
2
3
4
5
6
7
8//必要调用实现的系统方法
//手势过程中,通过updateInteractiveTransition设置转场过程动画进行的百分比,然后系统会根据百分比自动布局动画控件,不用我们控制了
[self updateInteractiveTransition:percentComplete];
//完成转场操作
[self finishInteractiveTransition];
//取消转场操作
[self cancelInteractiveTransition];
3、转场时最上层的视图控制器需要遵循
1 | //设置转场代理 |
###导航控制器push和pop 自定义转场
1、略…同上
2、略… 同上
3、在push动画之前设置导航控制器的转场动画代理,转场时最上层的视图控制器需要遵循
1 | //在push动画之前设置转场动画代理 |
###全屏侧滑返回
创建一个继承于UINavigationController的一个对象WSLNavigatioController,遵守协议
,实现如下方法:
1 | // 获取系统自带滑动手势的target对象 |
解决UIScrollView的滑动手势与全屏侧滑手势的冲突
创建一个UIScrollView的类别UIScrollView+GestureConflict,重写如下方法:
1
2
3
4
5
6
7
8
9
10
11 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
// 首先判断otherGestureRecognizer是不是系统pop手势
if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
// 再判断系统手势的state是began还是fail,同时判断scrollView的位置是不是正好在最左边
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {
return YES;
}
}
return NO;
}
更新于 2018/8/17 iOS 全屏侧滑手势/UIScrollView/UISlider间滑动手势冲突
推荐阅读:
https://www.jianshu.com/p/45434f73019e
http://www.cocoachina.com/ios/20150811/12897.html