滑动返回功能
- 自从iOS7开始, 导航控制器自带滑动返回上一级控制器的功能,并且只能在屏幕最左边边缘滑动才有效果
- 滑动返回功能为什么失效:
- 只要覆盖了系统返回按钮,滑动返回功能就失效, 是上面统一设置键系统的返回按钮覆盖掉, 就没有返回功能
- 问题分析:
- 当覆盖了系统返回按钮时, 苹果做了一些事情导致滑动返回功能失效
- 滑动返回是手势操作, 可以推测苹果是对这个手势做了一些处理, 能够实现滑动返回功能
- 用了滑动手势去做 , 验证:滑动手势在不在(pass)
- 需要找到这个手势, 这个功能是在有导航控制器,并且不覆盖系统返回按钮的情况下才有的功能 .所有可以进去 UINavigationController 搜索是否有Gesture之类的手势操作关键字
- 能够找到这个属性,推测可能就是这个手势使得能够滑动返回功能.
@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
- 滑动手势是只读的.那么怎么能干掉这个手势?
- 如果一个属性是只读的, 那么可以尝试这个属性是否有代理, 通过代理方法也能实现某些功能.并且上述是属性是手势, 就必然有代理.
self.interactivePopGestureRecognizer.delegate = self;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
return NO;
}
- 通过上面代码执行后发现禁止手势代理方法后, 滑动返回功能没有了. 因此可以判断通过 interactivePopGestureRecognizer 就是实现滑动返回功能的关键.
- 如何在自定义返回按钮的情况下也有滑动返回功能?
- 只要把系统手势的代理设置为nil,不让代理去触发某些方法使得滑动返回功能失效, 就能恢复滑动返回功能
- (void)viewDidLoad {
[super viewDidLoad];
self.interactivePopGestureRecognizer.delegate = self;
}
#pragma mark -UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return self.childViewControllers.count > 1;
}
- 清空手势代理, 将自己设置为自己的手势代理, 就可以恢复滑动功能
- 注意: 要判断是否为根控制器, 如果是根控制器, 则取消滑动功能
- 如果: 不取消根控制器的滑动功能, 会出现 bug 假死状态:程序一直在跑,但是界面死了
- 全屏滑动: 分析为什么导航控制器的滑动只能边缘滑动; 需求全屏活动