最近由于项目需要,了解了下苹果在iOS7以后对导航控制器增加的一个Pop手势的相关知识。但是系统限制必须是屏幕左侧的一定区域才能触发此手势。而且悲催的是由于项目需要自定义Pop左键,使得自带的手势效果也GG了。
想着如果能够自定义一个与Pop手势完全一样的拖动手势,就可以使用系统的Pop动画,一切都变得完美就好了。

我们知道,系统的这个手势在是导航控制器的一个属性interactivePopGestureRecognizer,继承于UIGestureRecognizer。悲剧的是,属性为readonly,所以我们不能直接把它转成自定义的手势。


根据runtime机制遍历了下它所有的属性类型和属性名。可以看到UIGestureRecognizer有一个叫_targets的属性,它的类型为NSMutableArray。原来屌丝苹果是用数组来存储每一个手势的target,所以可以动态的增加手势触发对象。了解这个我们拿到这个属性的名字"_targets"通过kvc获取它,接着打印出来。


可以看到数组里面唯一的一组数据,其中有个UINavigationInteractiveTransition对象,对应着target为key值,猜测即为手势的target。
网友评论