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 导航栏隐藏透明处理 && 侧滑返回手势,稍有调整,当做笔记记录