您的位置:首页 > 移动开发 > IOS开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: