登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

查看: 225|回复: 6

Runtime__iOS利用Runtime自定义控制器POP手势动画,ios中的runtime

[复制链接]

290

主题

600

帖子

493

金钱

手工艺人

发表于 2017-12-28 11:14:32 | 显示全部楼层 |阅读模式

        前言

        Runtime__iOS利用Runtime自定义控制器POP手势动画。苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操作。

        



       

        nav_pop_origin.gif

        这个操作的想法非常好,但是系统给我们规定的范围必须是屏幕左侧边缘才可以触发,这样实际使用过程中对于有些产品会产生不便,于是有些app就采取整个屏幕都响应这个手势并且pop动画还是用系统原生的,这样操作起来确实方便好多。

        



       

        nav_pop_custom.gif

        开始大家一定会有疑问,给控制器的View加个手势然后拖动控制器的View时改变它的frame不就可以了吗?没错,加手势这个想法是正确的。但是,由我们自己来改变控制器视图的位置是比较麻烦的,细心的朋友一定发现了,我们自定义pop手势上面的导航栏也是在随着你的手势拖拽而变动的,所以这样做还需要负责导航栏的动画,而且有一个重点问题,如果单独拖动view,这个view下面会是黑黑的一片,因为控制器的push和pop层级是由系统管理的。

        



       

        nav_pop_failed.gif

        所以走这条路虽然可以,但实现起来会比较艰辛。那么,如何实现这个效果呢?今天就给大家提供两套实现方案。

        [1]

        方案一:自定义UIViewControllerInteractiveTransitioning对象,实现导航控制器代理方法。

        这个是苹果官方推荐的做法,在WWDC 2013 218 - Custom Transitions Using View Controllers中有说明。

        这套方案虽然实现比较麻烦,但是动画相对灵活,你可以实现这样的效果,

        



       

        nav_pop_cube.gif

        也可以有这种效果。

        



       

        nav_pop_flip.gif

        其实这个拖动过程属于导航控制器的动画,所以我们需要重写UINavigationController的两个代理方法,navigationController: animationControllerForOperation: fromViewController: toViewController: (名字很长下面就称为方法1)和

        navigationController: interactionControllerForAnimationController: (方法2)。

        解释一下他们的作用,方法1是苹果提供给我们用来重写控制器之间转场动画的(pop或者push)。方法2你可以这样理解,苹果让我们返回一个交互的对象,用来实时管理控制器之间转场动画的完成度,通过它我们可以让控制器的转场动画与用户交互(注意一点,如果方法1返回是nil,方法2是不会调用的,也就是说,只有我们自定义的动画才可以与控制器交互)。

        下面我们来看一下实现过程。为了便于大家理解,我会尽量在Demo中的注释写的最清晰明了。

        同时,我们先用最简单的代码实现,在这篇文章的最后我会对本例中的Demo提供一个相对合理的写法。

        首先在方法1中,我们返回一个遵守了UIViewControllerAnimatedTransitioning协议的对象,它就是自定义的动画对象,我们给它起名PopAnimation,在这个类中实现两个方法来自定义转场动画。

        



       

        屏幕快照 2015-03-28 下午6.49.05.png

        再来看方法2,我们需要返回一个遵守了UIViewControllerInteractiveTransitioning协议的对象(提示一下,这两个协议容易混淆,要注意区分,一个是负责动画,一个是负责交互过程),苹果已经有一个类专门处理这个功能,它叫UIPercentDrivenInteractiveTransition,当然你也可以自定义一个这样的类。我们可以这样理解它的作用:前面在方法1中返回的动画,会在执行的过程中被系统分解以用于用户交互,这个交互过程的动画完成度就由它来调控。下面我们来看一下如何使用它。(为了让控制器视图拖动,我们给控制器的视图加了一个拖动手势,在拖动方法里我们对这个对象进行操作)

        



       

        屏幕快照 2015-03-29 下午12.33.59.png

        最后在视图控制器里重写导航栏的两个方法。

        



       

        屏幕快照 2015-03-29 下午12.37.51.png

        有两点不要忘记:

        设置导航控制器的代理为当前控制器。给控制器加手势。

        OK,这样我们就完成了这个过程。

        



       

        nav_pop_own.gif

        [2]

        方案二:Runtime+KVC

        要了解这样的做法,需要有Runtime的一些知识,会涉及到私有变量、私有方法的获取,但是这样做比较简单也比较有趣,如果你感兴趣就继续看下去吧。关于Runtime的知识,今后我会分享到博客里,朋友们敬请期待。

        为了方便大家阅读下面的代码,我们需要先了解系统的这个手势。

        前面我们了解到,这个手势属于UINavigationController,我们就跳到它的头文件里看看能不能找到线索。这个思路是正确的,确实有一个手势叫做interactivePopGestureRecognizer。属性为readonly,就是说我们不能给他换成自定义的手势,但是可以设置enable=NO。ok,既然找到了它,就打印一下看看它到底是一个什么手势。

        



       

        屏幕快照 2015-03-26 下午5.17.35.png

[size=3

15

主题

7145

帖子

1710

金钱

手工艺人

发表于 2017-12-28 11:19:19 | 显示全部楼层
感谢大神~

21

主题

7158

帖子

2665

金钱

手工艺人

发表于 2017-12-28 11:24:41 | 显示全部楼层
感谢大神~

0

主题

7142

帖子

-525

金钱

限制会员

发表于 2017-12-28 11:31:04 | 显示全部楼层
code4app确实是个好地方,必须支持~

23

主题

7148

帖子

1048

金钱

iOS大神

Rank: 6Rank: 6

分享大神

发表于 2017-12-28 11:43:11 | 显示全部楼层
小弟学习了~支持,支持

16

主题

7181

帖子

1461

金钱

手工艺人

发表于 2017-12-28 11:54:59 | 显示全部楼层
支持,感谢,祝code4app越来越好~

21

主题

7196

帖子

2628

金钱

手工艺人

发表于 2017-12-28 12:00:34 | 显示全部楼层
相当不错,感谢无私分享精神!
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表