自定义返回按钮后手势返回就失效了,网上有很多方法都号称完美解决了,但在快速返回(注意:是非常快速的划屏幕边缘)时,依然会出现栈乱的问题导致crash.
网上常见的几种方法:
方法1:
方法2:
这些方法都能解决在push进去时的问题,但连续快速的返回,就会出现栈错乱,常见的错误如下:
nested pop animation can result in corrupted navigation barUnbalanced calls to begin/end appearance transitions for XXXController
由于手势返回时,会先执行popViewController,如果当前返回动画还没执行结束,紧接着又触发第二次就会出现问题。
解决思路自然就是第一次动画执行完之前,不让他触发。
在interactivePopGestureRecognizer的delegate里加入如下代码
//是否正在手势返回中的标示状态static BOOL _isPoping;-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ if (!_isPoping) { _isPoping = YES; return YES; } return NO;}-(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:YES]; //在didAppear时置为NO _isPoping = NO;}
这下终于随便怎么暴力后退都没问题了。
但是紧接着问题又来了,如果当前view是一个scrollview,有些情况,如果手指在45角方向划,由于返回手势还没执行就被取消了,被scrollview接管了,这时状态置为YES了,但是didAppear却没有调用。导致手势返回实效了。
又经过一番折腾,终于找到完美解决手势冲突,加上如下方法:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ [otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer]; return NO;}
只有在返回手势失败的情况下才让其他手势执行。
分享来源: