特定页面隐藏导航栏
也有一段时间没有解决项目内问题,觉得解决问题要比无目的翻阅技术文档有意义,目的性强记忆也深刻。
项目中也算是遇见了两处特定页面问题了,上次是特定页面支持横屏的问题,这次是特定页面支持隐藏导航栏问题。
问题描述:
接到修改时懵住了,忘记导航栏可以隐藏这个问题了,还是UI设计师给我拿出其他App效果后,我才加紧寻找解决方案,看到导航栏隐藏几个字,瞬间就笑了。常解决控制器实现特效啊、项目配置啊等等大难题,反而小学生的问题给懵住了。然后就开始设置隐藏导航栏的问题。
解决方案:
1.简单讲,在- (void)viewWillAppear;方法中隐藏导航栏;
2.在-(void)viewWillDisappear;方法中显示导航栏;
存在问题:
仅做此处理是要出现两个问题的;
1.消失是正常的,当childController做popViewController时,导航栏右侧会闪现黑框,非常明显;
2.当做模态presentViewcontroller弹出下一个带有导航控制器的页面时,本页面导航栏会先复现导航栏再做跳转;当childController做dismissViewController时,导航栏顶部会闪现黑框,非常明显;
解决问题:
1.第一个问题较易解决,在隐藏方法里设定动画为YES,在复现方法里设定动画为NO;
2.第二个问题稍微麻烦些,要添加一个新的属性来标注是否需要隐藏,稍后详解;
先贴代码:
导航栏隐藏方法:
- (void)viewWillAppear:(BOOL)animated {
[superviewWillAppear:animated];
if (_disappearLoginToviewWillAppear) {
_disappearLoginToviewWillAppear = NO;
}
else {
[self.navigationControllersetNavigationBarHidden:YESanimated:YES];
}
}
[superviewWillAppear:animated];
if (_disappearLoginToviewWillAppear) {
_disappearLoginToviewWillAppear = NO;
}
else {
[self.navigationControllersetNavigationBarHidden:YESanimated:YES];
}
}
导航栏复现方法:
- (void)viewWillDisappear:(BOOL)animated {
[superviewWillDisappear:animated];
if (_presentLoginToViewWillDisappear) {
_presentLoginToViewWillDisappear = NO;
}
else {
[self.navigationControllersetNavigationBarHidden:NOanimated:YES];
}
[superviewWillDisappear:animated];
if (_presentLoginToViewWillDisappear) {
_presentLoginToViewWillDisappear = NO;
}
else {
[self.navigationControllersetNavigationBarHidden:NOanimated:YES];
}
}
两个属性(其实一个已经够用,此处做理解才用两个)
BOOL _presentLoginToViewWillDisappear; //是否是由于弹起登录视图,导致个人中心控制器触发viewWillDisappear
BOOL _disappearLoginToviewWillAppear; //是否是由于登录视图弹出,导致个人中心控制器触发viewWillAppear
跳转处赋值属性:
UIStoryboard *stroyboard = [UIStoryboardstoryboardWithName:@"Login"bundle:nil];
UINavigationController *loginNav = [stroyboard instantiateViewControllerWithIdentifier:@"LoginNavigation"];
_presentLoginToViewWillDisappear = YES;
[selfpresentViewController:loginNav animated:YEScompletion:^{
_disappearLoginToviewWillAppear = YES;
UINavigationController *loginNav = [stroyboard instantiateViewControllerWithIdentifier:@"LoginNavigation"];
_presentLoginToViewWillDisappear = YES;
[selfpresentViewController:loginNav animated:YEScompletion:^{
_disappearLoginToviewWillAppear = YES;
}];
注解:
为什么要添加一个属性做判断呢,因为我们做隐藏和复现导航栏,逻辑上没有错,但是不能不管黑白一棒子打死,同一个导航栏情况下,当然可以简单实现,但是作为登录页面,多数作为单独模块来做,肯定不是一个导航控制器了,当然我也看过整个项目使用一个故事版完成几十个页面控制器的,我表示佩服,不懂怎么做团队协同,你说不协同,那我无话可说,你离开公司以后还是一个人维护吗?言归正传,如果不是一个导航控制器,你做隐藏导航栏是徒劳的,反而化蛇添足,所以,判断下,是否是同一个导航栏,如果不是,那么就不用复现了,保持隐藏。
写在最后:
为什么整理这么一篇低水准,较冷门的博文?我完成此功能前也上了不同网站寻找前师的教诲,但是很琐碎,有些仅提示了思路,其实两个问题中的第一个都没有解决,仅告诉了进来的时候隐藏,出去的时候复现。第二个问题更是完全没涉及,我想,不会没有人遇到同样问题的,一个方便一次性决绝特定导航栏隐藏问题,另一个是整理了大师们琐碎的答案吧。最后还是谢谢大家查阅,本小白,老鸟绕行,大牛轻拍!