iOS 如何在整个屏幕中都能实现滑动返回的效果

本文介绍如何在全局导航控制器中添加特定手势交互逻辑,包括设置手势、获取系统手势的target数组、解析方法签名并替换系统手势行为,以实现自定义的导航过渡效果。
 1 - (void)setupGetsInNav
 2 {
 3     UIGestureRecognizer *gesture = self.interactivePopGestureRecognizer;
 4     gesture.enabled = NO;
 5     UIView *gestureView = gesture.view;
 6     
 7     UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizer alloc] init];
 8     popRecognizer.delegate = self;
 9     popRecognizer.maximumNumberOfTouches = 1;
10     [gestureView addGestureRecognizer:popRecognizer];
11     /**
12      *  获取系统手势的target数组
13      */
14     NSMutableArray *_targets = [gesture valueForKey:@"_targets"];
15     /**
16      *  获取它的唯一对象,我们知道它是一个叫UIGestureRecognizerTarget的私有类,它有一个属性叫_target
17      */
18     id gestureRecognizerTarget = [_targets firstObject];
19     /**
20      *  获取_target:_UINavigationInteractiveTransition,它有一个方法叫handleNavigationTransition:
21      */
22     id navigationInteractiveTransition = [gestureRecognizerTarget valueForKey:@"_target"];
23     /**
24      *  通过前面的打印,我们从控制台获取出来它的方法签名。
25      */
26     SEL handleTransition = NSSelectorFromString(@"handleNavigationTransition:");
27     /**
28      *  创建一个与系统一模一样的手势,我们只把它的类改为UIPanGestureRecognizer
29      */
30     [popRecognizer addTarget:navigationInteractiveTransition action:handleTransition];
31 
32 }
1 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
2     /**
3      *  这里有两个条件不允许手势执行,1、当前控制器为根控制器;2、如果这个push、pop动画正在执行(私有属性)
4      */
5     return self.viewControllers.count != 1 && ![[self valueForKey:@"_isTransitioning"] boolValue];
6 }

只需要在全局的导航控制器中添加上边代码即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值