iOS 解决自定义导航栏不能侧滑返回

iOS中,导航栏默认是可以侧滑,但是自定义导航之后,侧滑返回失效。

解决办法:在自定义导航栏中增加侧滑手势判断,代码如下:

- (void)viewDidLoad {

    [super viewDidLoad];

    // 重置侧滑手势的代理

    __weaktypeof(self) weakSelf = self;

    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

        self.interactivePopGestureRecognizer.delegate = (id)weakSelf;

    }

}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {

    // 判断是否是侧滑相关的手势

    if(gestureRecognizer == self.interactivePopGestureRecognizer) {

        // 如果当前展示的控制器是根控制器就不让其响应

        if (self.viewControllers.count < 2 ||

            self.visibleViewController == [self.viewControllers objectAtIndex:0]) {

            returnNO;

        }

        // 如果个别页面不需要或者不能侧滑反,只要在这个方法返回NO就可以。代码如下:

        if ([self.topViewController isKindOfClass:[YourCustomViewController class]]) {

            returnNO;

        }

    }

    return YES;

}

// 接收到多个手势的代理方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    // 判断是否是侧滑相关手势

    if (gestureRecognizer == self.interactivePopGestureRecognizer&& [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {

        UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;

        CGPoint point = [pan translationInView:self.view];

        // 判断手势的方向是侧滑的方向(向右)让多个手势共存

        if (point.x > 0) {

            returnYES;

        }

    }

    return NO;

}



相信很多项目的导航栏都是自定义的,而且状态栏(电池栏)的模式也是根据页面的显示不同的样式,即设置:VC的:UIStatusBarStyle

ios13之前有2种:UIStatusBarStyleDefault 、UIStatusBarStyleLightContent

ios 13之后新增:UIStatusBarStyleDarkContent

注意:升级到iOS 13 之后;为了适配夜间模式,要把UIStatusBarStyleDefault 改为UIStatusBarStyleDarkContent

如果VC是模态出来的,直接重写preferredStatusBarStyle、prefersStatusBarHidden两个方法就可以。

代码如下:

//状态栏的前景色

-  (UIStatusBarStyle)preferredStatusBarStyle {

    return UIStatusBarStyleLightContent; 

}

// 状态栏是否隐藏

- (BOOL)prefersStatusBarHidden {

    return NO

}

问题来了:如果有导航栏,发现这两个方法不被调用

问题分析:

1:模态出来的ViewController 没有导航栏,ViewController重写以上2个方法,2个方法都会被调用,因此该怎么设置就怎么设置

2:导航栏push出来的ViewController,没有调用以上2个方法,是因为系统调用了导航栏NavigationController的preferredStatusBarStyle,因此不调用当前ViewController的preferredStatusBarStyle方法;

解决办法:既然问题已经定位到,要解决也很简单,就是让系统不调用NavigationController的preferredStatusBarStyle,而是调用导航栏栈顶ViewController的preferredStatusBarStyle;这样就能做到每个ViewController单独控制自己的状态栏的显示样式

代码如下:

- (UIViewController *)childViewControllerForStatusBarStyle {

    // visibleViewController 当前显示的ViewController

    // topViewController 导航栏栈顶的ViewController

    return self.topViewController;

}

- (UIViewController *)childViewControllerForStatusBarHidden {

    return self.topViewController;

}

你可能感兴趣的:(iOS 解决自定义导航栏不能侧滑返回)