iOS全屏手势返回

创建一个UINavigationViewController的子类,在子类viewDidLoad方法中写入下面代码,在使用导航控制器的时候使用这个子类就可以了。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIGestureRecognizer *sysges = self.interactivePopGestureRecognizer;
    sysges.enabled = NO;
    UIView *sysView = sysges.view;
    
    id target = [[sysges valueForKey:@"_targets"] firstObject];
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]init];
    SEL action = NSSelectorFromString(@"handleNavigationTransition:");
    [pan addTarget:[target valueForKey:@"_target"] action:action];
    [sysView addGestureRecognizer:pan];
}

原理就是拿到系统的返回手势,拿到系统手势作用的View,用runtime找到我们想要的targetaction,然后自定义一个pan手势,把系统的target和action填进去就ok了。
至于为什么我们拿到系统的东西重新弄个手势就可以全屏了,就是因为系统的手势修改了手势的作用范围。


找target和action如下:

    unsigned int count;
    Ivar *ivar = class_copyIvarList([UIGestureRecognizer class], &count);
    for (int i = 0; i < count; i++) {
       NSLog(@"%s", ivar_getName(ivar[i]));
    }

你可能感兴趣的:(iOS全屏手势返回)