UINavigationController返回手势失效问题

转载 2015年07月11日 14:08:05

从iOS7开始,系统为UINavigationController提供了一个interactivePopGestureRecognizer用于右滑返回(pop),但是,如果自定了back button或者隐藏了navigationBar,该手势就失效了。

image

这是为什么呢?

原因

我们知道,interactivePopGestureRecognizer从手势触发到行为发生,要经过下面的阶段:

image

interactivePopGestureRecognizer还存在,但没有起作用,可能是delegate里被阻断了没调用target/action,或者是调用了target/action没运行动画。

经过尝试(参考别人博客),发现自定义返回按钮或者隐藏navigationBar导致的该手势未起作用是因为在delegate阶段被阻断了。

如果我们知道action的名字,则可以添加一个自定义的滑动手势,直接调用该系统action。但API文档并没有提供。

结果就是要么自己实现滑动返回的动画action,要么自己重写interactivePopGestureRecognizer的delegate以让手势继续下去,触发系统的动画action。

实现方法

那就把delegate自己实现一下吧。

新建一个类BaseNavigationController,实现delegate:

1
2
3
4
- (void)viewDidLoad {
    [super viewDidLoad];
    self.interactivePopGestureRecognizer.delegate =  self;
}

让手势生效

1
2
3
4
5
6
7
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (self.viewControllers.count <= 1 ) {
        return NO;
    }

    return YES;
}

在需要滑动返回的地方的UINavigationController换成BaseNavigationController

完成!

image

然后考虑到在push动画发生的时候,禁止滑动手势,在BaseNavigationController添加

1
2
3
4
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];
    self.interactivePopGestureRecognizer.enabled = NO;
}

在使用navigationController的viewcontroller里添加

1
2
3
4
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}

结果

当然不需要把上面的代码都抄一遍,因为这么通用的功能由一位韩国开发者做成组件,放在了github https://github.com/devxoul/SwipeBack。你只需要

1
2
platform :ios, '7.0'
pod 'SwipeBack', '~> 1.0'

该工程用了category+JRSwizzle交换了上面涉及到的UINavigationController的那些方法,还额外考虑了只自定义back button而不隐藏navigationBar的情况。无需一行代码,让系统的右滑返回动画重新回来!


原文地址:http://chisj.github.io/blog/2015/05/27/uinavigationcontrollerfan-hui-shou-shi-shi-xiao-wen-ti/



ios 自定义返回按钮侧滑失效完美解决方案

其实很简单很简单,只需要添加下面这一句代码即可: self.navigationController.interactivePopGestureRecognizer.delegate = (id)se...
  • TianYou_Code
  • TianYou_Code
  • 2016-08-31 15:13:01
  • 1691

iOS 解决自定义导航栏返回按钮 系统右滑返回手势失效问题 最简单方法

使用系统的返回按钮当然什么问题都没有,但是如果要自定义返回按钮 ,将会出现系统右滑手机失效的问题。网上解决方法很多。这里只简单提供一种较为简单的方法. A控制器push到B控制器。 在B控制器里,...
  • HDFQQ188816190
  • HDFQQ188816190
  • 2016-08-24 15:49:00
  • 2666

ios侧滑返回:完美解决 interactivePopGestureRecognizer 卡住的

苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecogni...
  • baidu_31071595
  • baidu_31071595
  • 2016-03-12 09:45:26
  • 4781

iOS导航栏返回手势

心血来潮 整理了一下关于UINavigationController的一些总结首先来说一些细节问题: 1. 系统默认的返回按钮例如如果是从首页跳转则 如果跳转的页面title过长则为 如果我们想...
  • luobosiji
  • luobosiji
  • 2016-10-10 17:31:50
  • 1203

ios简单实用的界面手势返回上一级

  • 2015年04月14日 17:06
  • 45KB
  • 下载

ios开发 向右滑动手势实现返回.在NavigationController中如何设置

在navigationController中实现向右滑动 返回功能 系统提供的backbarbuttonitem,不用添加任何代码即可实现向右滑动后退功能,但是往往要对按钮修改样式等时,就需要自定义...
  • oZhengXu
  • oZhengXu
  • 2015-07-14 12:12:21
  • 2899

ios7自定义返回按钮后,右滑返回功能失效解决方法

http://blog.sina.com.cn/s/blog_9592635a0101fuk9.html -(void)viewWillAppear:(BOOL)animated{ ...
  • smilebigdear
  • smilebigdear
  • 2015-10-12 13:31:54
  • 529

iOS开发之边缘手势返回(解决自定义返回按钮手势无效)

边缘手势返回
  • KeepMission
  • KeepMission
  • 2016-01-27 14:21:54
  • 1458

iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决

在自定义返回按钮的时候,侧滑手势返回往往默认失效了,怎么让侧滑有效呢     UIButton  *btn =[UIButton buttonWithType:UIButtonTypeCustom]...
  • yy1992320
  • yy1992320
  • 2016-03-10 17:59:05
  • 1152

iPhone开发-ios7环境下如何禁用UINavigationController中的轻扫回退的手势

在ios7中,苹果公司给navigation增加了一个的默认属性,你手指从屏幕的左边框向右轻扫,将会回退到导航栈的前一个视图控制页面(controller),但是在我的app中和我设置的默认手势冲突了...
  • zcl369369
  • zcl369369
  • 2014-03-27 22:18:26
  • 7386
收藏助手
不良信息举报
您举报文章:UINavigationController返回手势失效问题
举报原因:
原因补充:

(最多只允许输入30个字)