参考了有其他大神的demo。然后自己又写一个来的。
首先继承一个UINavigationController。
接下来直接上代码
结合runtime的方法。
- (void)viewDidLoad {
[super viewDidLoad];
UIGestureRecognizer *recongnizer = self.interactivePopGestureRecognizer;
recongnizer.enabled = NO;
UIView *gestureView = recongnizer.view;
/**
* 创建拖动手势
*/
UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizer alloc] init];
popRecognizer.delegate = self;
popRecognizer.maximumNumberOfTouches = 1;
[gestureView addGestureRecognizer:popRecognizer];
u_int count;
Ivar *ivars = class_copyIvarList([UIGestureRecognizer class], &count);
for (int i =0; i<count; i++) {
//获取对应的变量
Ivar ivar = ivars[i];
//获取变量的名字
const char *ivarName = ivar_getName(ivar);
//获取对应变量的类型
//const char *ivarEncodingName = ivar_getTypeEncoding(ivar);
//通过Kvc获取这些
if ([[NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding] isEqualToString:@"_targets"]) {
NSMutableArray *_targetsArray= [recongnizer valueForKey:@"_targets"];
//获取对象
id getRecongnizerTarget = _targetsArray[0];
id uinavigationInteractiveTransition = [getRecongnizerTarget valueForKey:@"target"];
SEL handleTransition = NSSelectorFromString(@"handleNavigationTransition:");
//创建手势 跟系统一模一样的手势
UIPanGestureRecognizer *pangesture =[[UIPanGestureRecognizer alloc]initWithTarget:uinavigationInteractiveTransition action:handleTransition];
[self.view addGestureRecognizer:pangesture];
}
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
/**
* 1.当这个控制器是只有一个时候不执行手势。
* 2.当这push或者pop时候 不执行手势。
*/
return self.viewControllers.count != 1 && ![[self valueForKey:@"_isTransitioning"] boolValue];
}