当然,这是我目前感觉的最好最便捷的方式。
使用场景
在各种控制器在使用navigation进行push和pop切换时,我们时常需要让其中某一个控制器在进入时隐藏系统导航栏。接下来是方法。
方法
我们通常会给所使用的UINavigationController 设置一个自定义的基类。我们只需要在这个基类中做一点点操作。下面是代码
@interface WDBaseNavViewController ()<UINavigationControllerDelegate,UIGestureRecognizerDelegate>
@end
@implementation WDBaseNavViewController
- (void)viewDidLoad {
[super viewDidLoad];
//设置代理
self.delegate = self;
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
//如果控制器遵守了DLNoNav协议,则需要隐藏导航栏
BOOL noNav = [[viewController class] conformsToProtocol:@protocol(DLNoNav)];
//隐藏导航栏后会导致边缘右滑返回的手势失效,需要重新设置一下这个代理
self.interactivePopGestureRecognizer.delegate = self;
//设置控制器是否要隐藏导航栏
[self setNavigationBarHidden:noNav animated:YES];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return self.childViewControllers.count > 1;
}
至于上面的DLNoNav代理,随便定义一下就可以,仅仅作为一个标识。其实,如果你喜欢的话,甚至拿一个属性来区分也可以。只要知道这个控制器是不是需要隐藏导航栏,用什么方式都无所谓。
@protocol DLNoNav
//只要遵守了这个协议,该控制器就会隐藏导航栏
@end
接下来,只需要给需要的控制器遵守这个协议就可以了。
另外
这样设置隐藏导航栏的效果是与在viewWillAppear、viewWillDisappear等等生命周期的方法里去设置navigationBar的hidden是不一样的。后者在设置的时候会有导航栏突然消失或出现的问题。而前者的显示效果是,导航栏会跟随控制器一块移动,不再有切换时的动画效果。