滑动返回功能

  • 自从iOS7开始, 导航控制器自带滑动返回上一级控制器的功能,并且只能在屏幕最左边边缘滑动才有效果
  • 滑动返回功能为什么失效:
    • 只要覆盖了系统返回按钮,滑动返回功能就失效, 是上面统一设置键系统的返回按钮覆盖掉, 就没有返回功能
  • 问题分析:
    • 当覆盖了系统返回按钮时, 苹果做了一些事情导致滑动返回功能失效
    • 滑动返回是手势操作, 可以推测苹果是对这个手势做了一些处理, 能够实现滑动返回功能
  • 用了滑动手势去做 , 验证:滑动手势在不在(pass)
  • 需要找到这个手势, 这个功能是在有导航控制器,并且不覆盖系统返回按钮的情况下才有的功能 .所有可以进去 UINavigationController 搜索是否有Gesture之类的手势操作关键字
  • 能够找到这个属性,推测可能就是这个手势使得能够滑动返回功能.
@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
  • 滑动手势是只读的.那么怎么能干掉这个手势?
    • 如果一个属性是只读的, 那么可以尝试这个属性是否有代理, 通过代理方法也能实现某些功能.并且上述是属性是手势, 就必然有代理.
self.interactivePopGestureRecognizer.delegate = self; //把导航控制器作为这个手势的代理,并且遵守 <UIGestureRecognizerDelegate>, 在手势的代理方法里干掉这个手势
// 是否触发手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    // 设置为NO,使得手势失效.
    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 假死状态:程序一直在跑,但是界面死了
  • 全屏滑动: 分析为什么导航控制器的滑动只能边缘滑动; 需求全屏活动

results matching ""

    No results matching ""