『iOS开发刨根问底』之左边缘pop手势与scrollview左右滑动的手势冲突问题

背景1

大多数的在iOS7以前的应用都会使用一个叫MLNavigationController(或者类似)的导航栏,它提出了一种解决方案,可以让push出来的ViewController通过某种自定义的手势,配合自定义的动画效果Pop推出。

比如说,从一定缩小比例放大到屏幕大小的动画效果,再比如一些控件简单的应用,会有整个屏幕任意位置从左往右滑(Pan)都可以推出;这些都是可以自定义的。而左边缘手势也是其中的一种方案,历史悠久,所以iOS7以后,随着长脸iPhone5的推出,苹果自身也加入了这一个左边缘侧滑手势,请注意,是系统的UINavigationController,如果查看源代码,我们可以发现这一个手势在iOS7以后被添加了进来:

@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

好,我上面理清了手势冲突的一方——左边缘侧滑手势,可能的所有者:MLNavigationController或者UINavigationController。

那么接下来看看冲突的另一方到底是谁?

背景2

UIScrollView。

好像说的有点简单,具体展开就是,各种封装的控件里的UIScrollView。

——————————————————————————————————

方案

步骤一

搞清了冲突双方就好办了。之前搞了很久,就是因为没想清楚,先响应的是ScrollView的平移手势,因为它在上面,那个左边缘手势的所有者在最最下面,而系统只会在同一时间响应一个手势(你当然可以修改布尔值让系统响应多个手势,但是这意味着推出返回的时候,scrollview也在往右滑动,看起来很别扭,这个牺牲不好),所以应该要让优先级放到左边缘这个手势上,怎么放?

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;

使用说明:[低优先级requireGestureRecognizerToFail:高优先级];

步骤二

然后根据手势的所有者去找就可以了,ScrollView的太好找了(但是如果在一个大项目中怎么改,难道每一个都要重写方法吗?如果用的第三方类呢,如果用的是UIScrollview呢?自问自答,留给读者思考),这里主要说一下左边缘侧滑手势这个应用如果只有一个NavigationController,直接去AppDelegate里去找!被这个坑了很久,如果在推送那个界面的时候引用,会发现是nil,要从根源找起,绝对一抓一个准!

你可能感兴趣的:(『iOS开发刨根问底』之左边缘pop手势与scrollview左右滑动的手势冲突问题)