欢迎加入 iOS开发QQ群:151133690
项目开发navigationController的使用避免不了,随着界面的丰富我们会发现navigationBar的显示/隐藏变得极其恶心.
从有bar -> 无bar,
从有bar -> 有bar,
从无bar -> 无bar,
从无bar -> 有bar,
总有那么一种情况的跳转显得十分不友好,网上找了很多资料,总于整理了一个相对简单的方式,让navigationBar完美的显示/隐藏.(此方法已经三个完整商业项目验证,如果您在使用中有任何疑问或问题,欢迎指正)
先看效果图吧:
(关于自定义NavigationBar隐藏后或者自定义侧滑返回失效的问题,如果你想知道解决方案可以与我联系,后期会单独写一篇相关文章...)
做法其实很简单,这里我使用的是分类的方法 给UIViewController 建一个分类 直接放代码.
UIViewController+Hidden.h
//
// UIViewController+Hidden.h
// demo
//
// Created by 笨笨 on 2017/5/11.
// Copyright © 2017年 benben. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIViewController (Hidden)<UINavigationControllerDelegate>
@end
UIViewController+Hidden.m
//
// UIViewController+Hidden.m
// demo
//
// Created by 笨笨 on 2017/5/11.
// Copyright © 2017年 benben. All rights reserved.
//
#import "UIViewController+Hidden.h"
@implementation UIViewController (Hidden)
- (void)navigationController:(UINavigationController*)navigationController willShowViewController:(UIViewController*)viewController animated:(BOOL)animated {
if(viewController == self){
[navigationController setNavigationBarHidden:YES animated:YES];
}else{
//系统相册继承自 UINavigationController 这个不能隐藏 所有就直接return
if ([navigationController isKindOfClass:[UIImagePickerController class]]) {
return;
}
//不在本页时,显示真正的navbar
[navigationController setNavigationBarHidden:NO animated:YES];
//当不显示本页时,要么就push到下一页,要么就被pop了,那么就将delegate设置为nil,防止出现BAD ACCESS
//之前将这段代码放在viewDidDisappear和dealloc中,这两种情况可能已经被pop了,self.navigationController为nil,这里采用手动持有navigationController的引用来解决
if(navigationController.delegate == self){
//如果delegate是自己才设置为nil,因为viewWillAppear调用的比此方法较早,其他controller如果设置了delegate就可能会被误伤
navigationController.delegate = nil;
}
}
}
@end
用法就更简单了,只需将上面的分类文件拖到项目里,全局导入头文件,在需要隐藏navigationBar的UIViewController里这样写:(不需要隐藏的就不用管)
/注意是 viewWillAppear 方法
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//设置代理即可
self.navigationController.delegate = self;
}
----如果你的项目中所有的ViewController都有一个统一的基类 (比如都继承自BBViewController),只需把扩展类中的代码写到自定义基类里就行了.