SLNavigationController.m 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. //
  2. // SLNavigationController.m
  3. // DarkMode
  4. //
  5. // Created by wsl on 2020/6/11.
  6. // Copyright © 2020 https://github.com/wsl2ls ----- . All rights reserved.
  7. //
  8. #import "SLNavigationController.h"
  9. @interface SLNavigationController ()<UIGestureRecognizerDelegate>
  10. @end
  11. @implementation SLNavigationController
  12. - (void)viewDidLoad {
  13. [super viewDidLoad];
  14. self.view.backgroundColor =[UIColor clearColor];
  15. // 获取系统自带滑动手势的target对象
  16. id target = self.interactivePopGestureRecognizer.delegate;
  17. // 创建全屏滑动手势,调用系统自带滑动手势的target的action方法
  18. #pragma clang diagnostic push
  19. #pragma clang diagnostic ignored "-Wundeclared-selector"
  20. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
  21. #pragma clang diagnostic pop
  22. // 设置手势代理,拦截手势触发
  23. pan.delegate = self;
  24. // 给导航控制器的view添加全屏滑动手势
  25. [self.view addGestureRecognizer:pan];
  26. // 禁止使用系统自带的pop滑动手势
  27. self.interactivePopGestureRecognizer.enabled = NO;
  28. }
  29. #pragma mark -- UIGestureRecognizerDelegate
  30. // 什么时候调用:每次触发手势之前都会询问下代理,是否触发。
  31. // 作用:拦截手势触发
  32. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
  33. // 注意:只有非根控制器才有滑动返回功能,根控制器没有。
  34. // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器
  35. if (self.childViewControllers.count == 1 ) {
  36. // 表示用户在根控制器界面,就不需要触发滑动手势,
  37. return NO;
  38. }
  39. return YES;
  40. }
  41. //触发之后是否响应手势事件
  42. //处理侧滑返回与UISlider的拖动手势冲突
  43. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
  44. //如果手势是触摸的UISlider滑块触发的,侧滑返回手势就不响应
  45. if ([touch.view isKindOfClass:[UISlider class]]) {
  46. return NO;
  47. }
  48. return YES;
  49. }
  50. @end