iOS 隐藏导航栏

当然,这是我目前感觉的最好最便捷的方式。

使用场景

在各种控制器在使用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是不一样的。后者在设置的时候会有导航栏突然消失或出现的问题。而前者的显示效果是,导航栏会跟随控制器一块移动,不再有切换时的动画效果。

IMG_5DBACAB16612-1.jpeg

demo

https://github.com/DLsunset/WDHideNavigationDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容