美文网首页
iOS 解决自定义导航栏不能侧滑返回

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

作者: 小白e7899 | 来源:发表于2019-10-27 23:06 被阅读0次

    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 解决自定义导航栏不能侧滑返回

          本文链接:https://www.haomeiwen.com/subject/hjehvctx.html