设置控制器的interactivePopGestureRecognizer.delegate后容易出现界面卡死现象.
文档更新说明
- 最后更新 2017年01月05日
- 首次更新 2017年01月05日
前言
这个问题的出现还真是挺有意思的,一开始以为是系统问题,后来经过同事反复操作,甚至还录下了视频😂 ,操作了N次后,最后终于定位了问题并解决了.
具体现象就是某个界面点击之后偶尔会出现无法正确push界面,而是直接的卡死.
必现条件
视图情况如下
TabViewController-> NavigationViewController-> TableViewController-> Push A-> Push B
NavigationViewController为TabViewController的子视图之一,先Push A控制器,再Push B控制器,此时在B控制器中重写self.navigationItem.leftBarButtonItems,接着在视图viewDidAppear的时候设置返回手势的代理为如下:
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
这样设置之后,因为自定义了leftBarButtonItems之后被系统取消的边缘右滑返回手势会重新开启.现在问题来了,当用户对B, A控制器pop操作之后,回到NavigationViewController时,navigationController.interactivePopGestureRecognizer.delegate会被设置为nil了.
(这里有一个地方需要说明,在B控制器pop回A控制器时,navigationController.interactivePopGestureRecognizer.delegate会被自动重新设置为默认的_UINavigationInteractiveTransition对象,但是回到NavigationViewController时会被自动设置为nil)
由于NavigationViewController的手势代理由原来用于实现动画功能的代理变成了nil,因此再次触发pop动画时,界面会卡死.从视频中也可以看到最后触发开始的前一个步骤是边缘右滑操作(要仔细看.)
解决方案
1 | //在TableViewController显示完毕之后,禁用pop手势. |
当然啦,上面是最简单的解决方案了.另一个更加通用的解决方案就是自己实现一个pop手势互交动画,这样也就没有系统pop动画引起的任何问题啦😄~