最近在做項(xiàng)目是遇到需要隱藏導(dǎo)航欄的需求,第一想法是在界面要顯示的時(shí)候隱藏掉NaivgaionBar 然后在界面小時(shí)的時(shí)候顯示出來(lái):
-(void)viewWillAppear:(BOOL)animated {
[superviewWillAppear:animated];
// [self.navigationController setNavigationBarHidden:YES animated:YES];
}
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// [self.navigationController setNavigationBarHidden:NO animated:YES];
}
這種情況一般情況下是好用的打颤,但是K凄汀旷偿!
但是遇到界面A隱藏導(dǎo)航欄 push到界面B也隱藏導(dǎo)航欄砚作,這樣的情況就會(huì)出現(xiàn)問(wèn)題,尤其是使用滑動(dòng)返回手勢(shì),導(dǎo)航欄錯(cuò)亂的問(wèn)題很嚴(yán)重禁荸。后來(lái)經(jīng)過(guò)分析和查閱資料得出如下方法:
所有的controller都繼承自BaseViewController右蒲,那就在base里面設(shè)置
為了使滑動(dòng)手勢(shì)起作用需要設(shè)置下代理:
@interface BaseViewController ()<UINavigationControllerDelegate>
@end
在viewWillAppear里面設(shè)置
#pragma mark ViewWillAppear
- (void) viewWillAppear:(BOOL)animated {
[superviewWillAppear: animated];
// 1\. 返回手勢(shì)代理
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
// 2\. 導(dǎo)航控制器代理
self.navigationController.delegate = self;
}
代理方法中如下設(shè)置:
#pragma mark - Private Methods
#pragma mark -
#pragma mark Whether need Navigation Bar Hidden
- (BOOL)needHiddenBarInViewController:(UIViewController*)viewController {
BOOLneedHideNaivgaionBar =NO;
// 需要隱藏導(dǎo)航欄的頁(yè)面
if([viewControllerisKindOfClass: [HomeViewControllerclass]] ||
[viewControllerisKindOfClass: [SettingViewControllerclass]]||
[viewControllerisKindOfClass: [LoginViewControllerclass]]) {
needHideNaivgaionBar =YES;
}
returnneedHideNaivgaionBar;
}
#pragma mark - UINaivgationController Delegate
#pragma mark -
#pragma mark Will Show ViewController
- (void)navigationController:(UINavigationController*)navigationController willShowViewController:(UIViewController*)viewController animated:(BOOL)animated {
[self.navigationController setNavigationBarHidden: [self needHiddenBarInViewController: viewController]
animated: animated];
}
至此解決問(wèn)題