这几天产品增加了个新需求,要求增加滑动返回的手势。安卓上有返回按钮,但是iOS上没有返回按钮,增加一个返回的手势可以较大的提高用户体验。iOS7刚出来的时候系统增加了滑动返回手势,感觉特别好,但是发现把导航栏隐藏,自定义的滑动返回手势不好使。于是按照这个帖子(http://www.gowhich.com/blog/view/id/383)写的如何打开系统的滑动返回,并且如何避免出现的问题,结果发现不好使,在一级界面滑动,依然会出现画面卡住的问题。
垃圾方案一:
后来找各种第三方,https://github.com/Coneboy-k/KKNavigationController,这个导航栏原理是截了张图,放到内存里,刚开始觉得挺好,后来出现了一些问题,如卡顿。而且页面如果过多的话,内存肯定会增加不少。对于我这个完美主义者是不能接受的。
垃圾方案二:
这个帖子不知道大家看了没,http://www.cocoachina.com/ios/20150401/11459.html#0-tsina-1-2192-397232819ff9a47a7b7e80a40613cfe1。这里面第一种方法用起来有个弊端,滑动返回的过程中竟然会触发button的事件,而且屏幕返回的过程中根手指不在一起,感觉略怪。第二种方法简单些,但用了私有API,审核能过嘛?
下面完美的解决方案来了,不超过10行代码,以上所有问题全部解决。
直接在一级界面的viewWillAppear里注册delegate:
self.navigationController.interactivePopGestureRecognizer.delegate = self;
然后在一级界面的viewWillDisAppear里注销delegate(此句一定要写,否则会出其他bug):
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
然后在该界面实现代理方法:
#pragma mark - UIGestureRecognizer Delegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
//判断是否是一级视图,若是则关闭滑动返回手势
if (self.navigationController.viewControllers.count == 1) {
return NO;
}
else
{
return YES;
}
}
然后万事具备了。没有出现上面帖子中的任何问题。
参考:
http://blog.csdn.net/wmqi10/article/details/16850479
http://ju.outofmemory.cn/entry/103566
https://github.com/molon/MLTransition
https://github.com/singro/SCNavigation
Demo下载:https://github.com/yuedong56/GestureBack
QQ群:172158202,入群请注明求滑动返回的demo。