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 解决自定义导航栏返回按钮 系统右滑返回手势失效问题 最简单方法

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

解决UINavigationController自定义返回键后没有侧滑返回效果的问题

解决UINavigationController自定义返回键后没有侧滑返回效果的问题 1.思路 用自定义的UINavigationController进行代理实现,其它地方的导航栏都要使用这个...
  • heymacn
  • heymacn
  • 2015年07月25日 09:58
  • 344

IOS系列—— UINavigationController隐藏后手势返回不可用

在项目中 很多时候 会自定义导航条UIViewController *controller = (UIViewController *)[[[UIApplication sharedApplicati...
  • Engandend
  • Engandend
  • 2015年01月09日 15:40
  • 3318

NavigationController的视图,滑动手势返回

iOS 7中在传统的左上角返回键之外,提供了右滑返回上一级界面的手势。支持此手势的是UINavigationController中新增的属性 interactivePopGestureRecogni...
  • qq_27642183
  • qq_27642183
  • 2016年01月30日 10:52
  • 1159

右滑返回上一个界面FDFullscreenPopGesture

// The MIT License (MIT) // // Copyright (c) 2015-2016 forkingdog ( https://github.com/forki...
  • helloworld_junyang
  • helloworld_junyang
  • 2016年04月28日 10:21
  • 2034

UINavigationController返回手势失效问题

  • 2016年02月17日 18:28
  • 38KB
  • 下载

UINavigationController返回手势失效问题

转载:      http://blog.csdn.net/cuibo1123/article/details/46841607 从iOS7开始,系统为UINavig...
  • smilebigdear
  • smilebigdear
  • 2015年07月28日 09:51
  • 426

自定义导航栏返回按钮右滑返回手势失效等问题

完全自定义导航栏,在实际开发中,并不能满足特殊需求,因此更多情况下,还是需要配合系统导航栏自定义,从而达到我们想要的效果。当我们自定义返回按钮之后,就会出现系统的右滑Pop功能就失效了,这是其中的一个...
  • LLy_Alex
  • LLy_Alex
  • 2016年09月07日 15:17
  • 638

IOS系列—— UINavigationController隐藏后手势返回不可用

在项目中 很多时候 会自定义导航条UIViewController *controller = (UIViewController *)[[[UIApplication sharedApplicati...
  • Engandend
  • Engandend
  • 2015年01月09日 15:40
  • 3318

iOS自定制导航栏返回按钮或者隐藏导航栏pop手势失效解决方案

在iOS开发的工作当中,Push和Pop经常用于界面之间的跳转和返回。苹果在iOS7以后给导航控制器加了一个Pop手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会随着你的手指移动,当用户松手后,系...
  • wujakf
  • wujakf
  • 2017年05月05日 14:21
  • 421
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UINavigationController返回手势失效问题
举报原因:
原因补充:

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