1.导航控制器自带了滑动返回(iOS7)
2.但是设置界面没有滑动返回功能
3.恢复滑动返回
分析:为什么滑动返回失效—>覆盖了系统的返回按钮—>怎么才能让滑动返回失效
滑动返回实现原理:添加pan手势
怎么让手势失效:代理方法可以让界面不能与用户交互....
分析发现系统是通过代理让滑动返回失效的
解决办法:清空代理
4.全屏滑动返回
系统自带的是屏幕边缘滑动返回,与需求不符
我们要自己写一个滑动返回? 太麻烦
系统已经有了,把系统的拿过来改一下
5.怎么修改?
先找到对应的手势,和手势的代理, 怎么找??
滑动返回是导航控制器的功能,那么手势应该在导航控制器里面
在导航控制器头文件中搜索gesture,我们找到interactivePopGestureRecognizer
我们通过打印它可以得到一些信息
; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fb413d0c460>)>>
在信息中我们可以找到代理,而且知道系统的手势是UIScreenEdgePanGestureRecognizer边缘手势
6.怎么修改为全屏滑动
修改手势方法为UIPanGestureRecognizer
清除系统的边缘滑动手势
手势方法调用系统的滑动返回方法,handleNavigationTransition:
设置代理为自己,不让代理方法失效
target的action滑动返回功能
// 干掉系统边缘滑动手势
self.interactivePopGestureRecognizer.enabled=NO;
// 创建UIPanGestureRecognizer:滑动返回功能
idtarget =self.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer*pan = [[UIPanGestureRecognizeralloc]initWithTarget:targetaction:@selector(handleNavigationTransition:)];
[self.viewaddGestureRecognizer:pan];
// 设置代理,控制手势什么时候触发
pan.delegate=self;
// 每次触发手势,询问下代理是否触发手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch
{
// 判断下是否是非控制器,如果是非根控制器就返回YES
returnself.childViewControllers.count>1;
}
网友评论
然后写代码:
- (void)viewDidLoad
{
[super viewDidLoad];
self.interactivePopGestureRecognizer.enabled = NO;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
pan.delegate = self;
// NSLog(@"'%@",[self.interactivePopGestureRecognizer.delegate class]);
[self.view addGestureRecognizer:pan];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
// NSLog(@"%@",gestureRecognizer);
// NSLog(@"%lu",self.childViewControllers.count);
if (self.childViewControllers.count >1) {
return YES;
}
return NO;
}