iOS系统右滑返回全局控制方案
2016-04-07 16:04
253 查看
前言
今天有个小需求,在点击导航条上的返回按钮之前要调用某个API,并弹出UIAlertView来显示,根据用户的选项判断是否是返回还是继续留在当前控制器。举个简单的例子,当点击导航条上的左上角返回按钮时,就调用我们的API来提示是否知道,点击知道则返回,点击不知道则继续留在当前控制器。那么问题来了,导航自带的右滑返回手势在点击系统的返回按钮时,不会没有办法处理,那是自动的,因此就要想办法改成leftBarButtonItem了,但是使用了leftBarButtonItem就没有了右滑返回手势。
鱼和熊掌不可兼得?笔者自有办法!
笔者尝试写个demo来验证有什么办法可以解决,尝试了以下四种:
只在当前controller遵守UIGestureRecognizerDelegate并设置代理为self
将UIGestureRecognizerDelegate放在公共基类控制器遵守并设置代理为self,然后子类重写代理方法
将UIGestureRecognizerDelegate放在公共导航类HYBNavigationController里遵守,并设置代理为导航类,然后重写push/pop相关的所有方法
将UIGestureRecognizerDelegate放在公共导航类HYBNavigationController里遵守,并设置代理为导航类,但是,只遵守-gestureRecognizerShouldBegin:代理方法
方案一(不可行)
方案一:只在当前controller遵守UIGestureRecognizerDelegate并设置代理为self为什么不可行呢?当想不测试怎么知道呢?光想是很难考虑全面的。于是写了个小demo来测试。
我们在该controller里这样写:
@interface HYBNavigationController () <UIGestureRecognizerDelegate> @end @implementation HYBNavigationController - (void)viewDidLoad { [super viewDidLoad]; self.interactivePopGestureRecognizer.delegate = self; } - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { BOOL ok = YES; // 默认为支持右滑反回 if ([self.topViewController isKindOfClass:[HYBBaseViewController class]]) { if ([self.topViewController respondsToSelector:@selector(gestureRecognizerShouldBegin)]) { HYBBaseViewController *vc = (HYBBaseViewController *)self.topViewController; ok = [vc gestureRecognizerShouldBegin]; } } return ok; } @end
View Code
使用方法与第三种方案一样,是不是非常地简化了?看来是元宵给我的礼物啊,突然想到这样的办法。以前一直没有研究过interactivePopGestureRecognizer属性,这个属性是iOS7以后才有的,因此在项目中一直不能直接使用leftBarButtonItem处理,除非那个界面不要右滑返回。
现在,一切都明了了,想要使用leftBarButtonItem在公共基类控制器中统一调用API来设置就非常简单了,右滑返回手势也可以正常使用~
还等什么,赶紧试试吧!
最后
如果你所使用的项目也有这样的需求,不防试试吧!笔者提供了demo的,因此可以先下载demo来看看效果哦!经过多次测试,笔者认为这是可行的方案,大家若在使用中出现问题,还请反馈与笔者,我也想了解是什么情况,当然也要找解决方案,共同进步嘛。源代码
请大家到GITHUB下载吧:CoderJackyHuang相关文章推荐
- IOS开发支付宝集成
- Mac/ios 模拟器 测试模拟慢网速
- IOS图片操作
- iOS 设置系统的状态栏隐藏的方法分享
- iOS可执行文件瘦身(一)资源优化
- iOS项目中安装和使用 Cocoapods
- 【疯狂造轮子-iOS】JSON转Model系列之二
- iOS-解决XCode7.3 上无法安装 Alcatraz PackageManager
- iOS - QRCode(二维码)的生成和识别
- ios上的数据持久化问题概览(Data Persistence On iOS – An Overview)
- 用Berkeley sockets实现ios上进程间通信
- iOS Provisioning Profile(Certificate)与Code Signing详解
- iOS KVC KVO 代码 详解
- ios 开源代码
- IOS开发-表单控件的应用
- IOS-处理异常崩溃(摘自iPhone Tutorials)
- iOS开发中的错误整理,导航控制器的导航栏取消系统渲染的错误
- IOS-线程异步操作GCD
- iOS-如何让xcode自动检查内存泄露
- ios-调试程序打印详细信息 文件名 函数名 行号