iOS禁用侧滑返回手势要点解析

项目中可能某些页面返回按钮需要自定义,然后在点击返回按钮时做出某些判断,或者直接pop到根控制器,这时候需要禁用侧滑返回手势,防止它不走判断的代码直接返回上个界面。

网上找了些资料,大致方法有两种,但要注意的点没有提到,容易出错,这里整理下:

需求:A -> B -> C,要求B页面禁用侧滑返回

1. B push到 C,C页面可以侧滑返回;

2. B pop回 A,再从A push D,D要可以侧滑返回。

方法一:

在B页面的生命周期设置如下代码

-(void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  }
}
-(void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
  };
} 

注意:

1、是在viewDidAppear里面禁用导航的侧滑手势,不要在viewWillAppear中设置!

如果在viewWillAppear中禁用了手势,你会发现B->C之后,在C界面侧滑返回时,APP会进入假死状态。原因是B界面将要出现时,你禁用了侧滑手势,导致C侧滑失败,界面卡住。所以要在B界面出现之后,再禁用侧滑手势。

2、要在viewWillDisappear里面激活导航的侧滑手势,不是viewDidDisappear!

导航是共用的,如果不激活就返回了,其他页面也将无法侧滑返回!而在viewDidDisappear设置激活是无效的,要在页面即将消失时激活。

方法二:

也是在B页面的生命周期设置如下代码。方法一是直接关闭和激活侧滑手势,方法二则是B遵循协议UIGestureRecognizerDelegate,设置侧滑交互代理,重写手势方法。

@property (weak, nonatomic) id<UIGestureRecognizerDelegate> restoreInteractivePopGestureDelegate; 

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view. 

  _restoreInteractivePopGestureDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
} 

-(void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
  }
}
-(void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.delegate = _restoreInteractivePopGestureDelegate;
  };
}
#pragma mark -UIGestureRecognizerDelegate
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
  return NO;
}

这里主要解释下为什么要记录导航的侧滑手势代理:

我们有时候会自定义UINavigationController基类,里面可能已经设置了侧滑手势代理,所以在B界面出现后我们重新设置代理为B,消失前我们要把代理重新改回为原来的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android仿iOS实现侧滑返回功能(类似微信)
  • iOS push侧滑返回功能实现方法
(0)

相关推荐

  • iOS push侧滑返回功能实现方法

    本文实例为大家分享了iOS push侧滑返回功能的具体代码,供大家参考,具体内容如下 开启iOS自带的push的侧滑返回功能(只有左侧边缘地带响应侧滑返回,并不是全局响应): - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { [self.navigationContr

  • Android仿iOS实现侧滑返回功能(类似微信)

    我们都知道侧滑返回操作是 iOS 里面比较常见的功能,一般是手指在靠近手机屏幕左边缘向右滑动就可以关闭当前的界面,iOS 系统提供了这样的 API,但是 Android 怎么实现呢?网上找了许多方法,比较了一下,个人觉得还是这个比较方便也容易理解, 先上个效果再说: 原理 Activity 本身是不可以滑动的,但是我们可以制造一个正在滑动 Activity 的假象,使得看起来这个 Activity 正在被手指滑动.其原理其实很简单,我们滑动的其实是 Activity 里面的可见View元素,而我

  • iOS禁用侧滑返回手势要点解析

    项目中可能某些页面返回按钮需要自定义,然后在点击返回按钮时做出某些判断,或者直接pop到根控制器,这时候需要禁用侧滑返回手势,防止它不走判断的代码直接返回上个界面. 网上找了些资料,大致方法有两种,但要注意的点没有提到,容易出错,这里整理下: 需求:A -> B -> C,要求B页面禁用侧滑返回 1. B push到 C,C页面可以侧滑返回; 2. B pop回 A,再从A push D,D要可以侧滑返回. 方法一: 在B页面的生命周期设置如下代码 -(void)viewDidAppear:(

  • iOS禁用右滑返回的两种方法

    本文实例为大家分享了iOS禁用右滑返回的具体代码,供大家参考,具体内容如下 方式一: 前提:如果使用的自定义UINavigationController基类,请不要在此基类里写相关的手势操作方法. 代码如下: -(void)viewDidAppear:(BOOL)animated{ if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.naviga

  • iOS UIScrollView和控制器返回手势冲突解决方法

    开发中,有部分UI,会将UIScrollView横向铺在底层,上面放tableView 或一些视图左右滚动切换,底层的scrollView会和Nav ViewController原有的返回手势冲突 解决办法,重写UIScrollView 的gestureRecognizerShouldBegin,在ScrollView滚动到头的时候,屏蔽ScrollView的手势 class GesturesConflictScrollView: UIScrollView { override func ges

  • ORACLE SQL语句优化技术要点解析

    操作符优化: IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询. 由此可见用IN的SQL至少多了一个转换的过程.一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了. 推荐方案:

  • 19个MySQL性能优化要点解析

    以下就是跟大家分享的19个MySQL性能优化主要要点,一起学习学习. 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的.因为,我们某些查询语句会让MySQL不使用缓存.请看下面的示例: // 查询缓存不开启 $r = mysq

  • 右滑返回手势和UIScrollView中手势冲突的解决方法

    项目中遇到一个页面中是以一个scrollview横向Tab展示两个不同功能的显示,譬如消息和公告功能,但是由于滑动返回手势和scrollview的滑动返回手势冲突了,导致页面不再能够滑动返回.类似的还有图片浏览功能也出现过. iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用.UIScrollView的滑动手势也是UIPanGestureRecognizer.那在

  • 剖析Android Activity侧滑返回的实现原理

    简介 使用侧滑Activity返回很常见,例如微信就用到了.那么它是怎么实现的呢.本文带你剖析一下实现原理.我在github上找了一个star有2.6k的开源,我们分析他是怎么实现的 //star 2.6k 'com.r0adkll:slidableactivity:2.0.5' Slidr使用示例 它的使用很简单,首先要设置透明的窗口背景 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBa

  • iOS StoreKit 2 新特性盘点解析

    目录 一.背景 二.物料 三.StoreKit 1 存在的问题 四.StoreKit v2 新特性 五.StoreKit 2 API 5.1 只支持 Swift 开发 原始获取商品方式 新获取商品方式 5.2 新 API 5.2.1 Product 5.2.2 Transaction History 5.2.3 Subscription status 5.2.4 show manager subscriptions 5.2.5 request refund API 小结: 六.Server to

随机推荐