iOS实践

iOS 导航栏隐藏和显示

2022-01-11  本文已影响0人  孤雁_南飞

1: 导航栏隐藏、显示之间跳转
iOS 导航栏对于隐藏造成的动画 可以通过在 viewWillAppear 和 viewWillDisappear 来设置完成

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
     [self.navigationController setNavigationBarHidden:NO animated:animated];
}

但是对于多级跳转的则不行 , 隐藏导航栏的viewcontroller 跳转到隐藏或不隐藏的页面,会导致导航栏出现种种问题

所有viewcontroller继承自该vc
如需隐藏导航栏,hj_NavIsHidden 设置 YES 即可

//.h

///是否隐藏导航栏 默认 NO 不隐藏
@property (nonatomic, assign) BOOL hj_NavIsHidden;


//.m 
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    if (self.hj_NavIsHidden) {
        [self.navigationController setNavigationBarHidden:YES animated:animated];
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    if (self.hj_NavIsHidden) {
        if ([self hj_pushOrPopIsHidden] == NO) {
            [self.navigationController setNavigationBarHidden:NO animated:animated];
        }
    }
}

///监听push下一个或 pop 上一个,是否隐藏导航栏
- (BOOL)hj_pushOrPopIsHidden {
    NSArray * viewcontrollers = self.navigationController.viewControllers;
    if (viewcontrollers.count > 0) {
        HJViewController * vc = viewcontrollers[viewcontrollers.count - 1];
        return vc.hj_NavIsHidden;
    }
    return NO;
}

swift


    ///是否隐藏导航栏,默认false
    open var yl_naviBarIsHidden: Bool = false
    
    ///push下一个或 pop 上一个,是否隐藏导航栏
    private func yl_pushOrPopIsHidden() -> Bool {
        if let viewcontrollers = navigationController?.viewControllers {
            if let vc = viewcontrollers[viewcontrollers.count - 1] as? YLViewController {
                return vc.yl_naviBarIsHidden
            }
            return false
        }
        return false
    } 

    open override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if yl_naviBarIsHidden {
            navigationController?.setNavigationBarHidden(true, animated: animated)
        }
    }
    open override func viewWillDisappear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if yl_naviBarIsHidden {
            if yl_pushOrPopIsHidden() == false {
                navigationController?.setNavigationBarHidden(false, animated: animated)
            }
        }
    }

上面代码支持边框左滑返回,
如果你使用了侧滑返回,上面代码请忽略,请使用侧滑返回库里面的
此处拿 FDFullscreenPopGesture 侧滑返回举例

/// Indicate this view controller prefers its navigation bar hidden or not,
/// checked when view controller based navigation bar's appearance is enabled.
/// Default to NO, bars are more likely to show.
/// 指示此视图控制器是否首选隐藏其导航栏,
/// 启用基于视图控制器的导航栏外观时选中。
/// 默认为 “否”,条形图更有可能显示。
@property (nonatomic, assign) BOOL fd_prefersNavigationBarHidden;

把 FDFullscreenPopGesture 里面 fd_prefersNavigationBarHidden 在导航栏隐藏的时候设置YES就好,例如:

        self.fd_prefersNavigationBarHidden = YES;  

文章借鉴自:iOS 导航栏隐藏透明处理 && 侧滑返回手势,稍有调整,当做笔记记录

上一篇 下一篇

猜你喜欢

热点阅读