UINavigationController实现全屏滑动返回功能

说明: 

UINavigationController默认在push出的控制器中都有边沿滑动返回功能,但是只能从屏幕左边滑才能返回,若从屏幕中间画并没有效果。下面实现全屏滑动功能。

探究:

系统默认能够实现滑动返回是因为UINavigationController具有interactivePopGestureRecognizer,所以我们可以使用NSLog打印出它的全部信息如下

<UIScreenEdgePanGestureRecognizer: 0x7fdf4a431c70; state = Possible; enabled = NO; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fdf4a791830>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fdf4a4314e0>)>> 

从打印信息可以看出

  • interactivePopGestureRecognizer的真实类型为UIScreenEdgePanGestureRecognizer(屏幕边沿手势)
  • 手势调用的方法为handleNavigationTransition:
  • 手势的Target对象的类型为_UINavigationInteractiveTransition

实现思想:

给UINavigationController的view添加滑动手势pan,替换掉系统的手势,并在触发pan手势时调用系统的方法。

实现难点:

  • 系统手势调用方法,(通过打印信息以获得)
  • target对象 通过加断点调试查看系统手势的target和系统手势的代理发现他们的类型和地址都相同,说明系统手势的代理即为系统手势的target。 

实现代码:

- (void)viewDidLoad {
    [super viewDidLoad];

   // 获取系统手势的target对象
    id tagart = self.interactivePopGestureRecognizer.delegate; // 创建手势调用系统的方法 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget: tagart action:@selector(handleNavigationTransition:)]; // 添加手势 [self.view addGestureRecognizer:pan]; // 设置手势的代理 pan.delegate = self; // 禁能系统的手势 self.interactivePopGestureRecognizer.enabled = NO; } // 手势的代理方法 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // 非根控制器使能手势 return self.childViewControllers.count > 1; } 

注意点:

在手势的代理方法中要判断是否是跟控制器,如果是根控制器要禁能手势

  • 因为手势会触发滑动返回,若是根控制器则无法返回,就会出现假死的bug

转载于:https://www.cnblogs.com/mengfei90/p/5210517.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值