iOS 状态栏和导航栏的控制

iOS的项目多数会遇到控制状态栏和导航栏的问题,比如隐藏状态栏、控制状态栏的文字颜色等,导航栏也有同样需求。

自从iOS7之后状态栏就是透明的了 高度 20.f   导航栏的高度是 64.f

状态栏的控制

状态栏的设置分为两种: 1.全局设置 2.分页面设置 控制这两种模式的开关是info.plist文件的配置项。
1).Property List 下是 View controller-based status bar appearance 2).Source Code 下是 UIViewControllerBasedStatusBarAppearance

全局设置

在info.plist 文件中设置 View controller-based status bar appearance 为NO 设置为全局设置,即vc中的方法是无法控制的,真正的控制方法如下:

//设置状态栏字体颜色
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//设置状态栏是否隐藏
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
/*
状态栏字体颜色上呢  只是说改变对应枚举值进行颜色设置 不能做任意修改 
   UIStatusBarStyleDefault     黑色                               
   UIStatusBarStyleLightContent 白色

状态栏是否显示,一般而言app不会对所有界面都不显示状态栏,而是只在特定的页面需要隐藏状态栏,比如对于视频播放界面不希望显示状态栏。

对于状态栏的背景色设置,从ios7开始状态栏本身实际上是透明的,它的背景色其实取决于导航栏。
*/

分页面设置

在info.plist 文件中设置 View controller-based status bar appearance 为YES 设置为分页面VC设置控制,分两种情况: 1.VC不在UINavigationController 或者说VC是根控制器

状态栏字体颜色设置

//直接设置导航栏字体颜色
- (UIStatusBarStyle)preferredStatusBarStyle
{ 
    //返回白色
    return UIStatusBarStyleLightContent;
    //返回黑色
    //return UIStatusBarStyleDefault;
}

在view的某个加载阶段比如viewWillAppear中,执行如下代码,这样更保险:

//刷新状态栏
[self setNeedsStatusBarAppearanceUpdate];

隐藏控制

//直接设置
- (BOOL)prefersStatusBarHidden {
    return YES;
}

在view的某个加载阶段比如viewWillAppear中,执行如下代码,这样更保险:

[self setNeedsStatusBarAppearanceUpdate];

2.当VC在UINavigationController中时(或者是VC不是根控制器),VC并不能通过上面的方式控制状态栏的颜色,需要通过如下方法间接控制:

状态栏字体颜色设置

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

隐藏控制

这个就比控制状态栏字体颜色要复杂一些了,这个需要通过子VC控制根VC,从而达到控制根控制器的目的,方法如下: 假设根VC为TabVC,那么TabVC中要设置如下代码

//TabVC
//定义一个变量来控制状态栏显示,子VC通过修改这个值来间接控制
@property (nonatomic ,assign) BOOL statusBarHidden;

- (BOOL)prefersStatusBarHidden {
    return _statusBarHidden;
}

//子VC
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    
    if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
        [self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)];
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
        //注意对NO的情况,不能传@NO,只能传nil才能被当成NO
        [self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil];
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

//可以看到在子VC中通过设置根VC的属性,并调用setNeedsStatusBarAppearanceUpdate后,根VC的prefersStatusBarHidden就会被调用,从而隐藏或显示状态栏。

导航栏

//iOS7 之后默认半透明
@property(nonatomic,assign,getter=isTranslucent) BOOL translucent //设置是否半透明 

//这是导航栏背景色 这个设置方法可以在AppDelegate中设置,父类中设置,全局可以生效。
[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]]; 
//导航栏背景色 控制器中也可以这么用
 [self.navigationController.navigationBar setBarTintColor:[UIColor yellowColor]];

//导航栏设置背景图片 注意图片高度 44.f 将不会设置状态栏背景 64.f 可置顶部位置 全部设置
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault]; 

//导航栏标题设置
//可以全局设置 在AppDelegate中 父类中
NSShadow *shadow = [[NSShadow alloc] init]; 
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8]; 
shadow.shadowOffset = CGSizeMake(0, 1); 
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
        [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName, 
        shadow, NSShadowAttributeName, 
        [UIFont fontWithName:@ "HelveticaNeue-CondensedBlack"  size:21.0], NSFontAttributeName, nil]];
//控制器中这么设置也可以
    [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:16.f],NSForegroundColorAttributeName:[UIColor WhiteColor]}];

//设置返回按钮(等系统按钮)可以通过TintColor,直接来设置颜色
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
    原文作者:移动开发
    原文地址: https://my.oschina.net/snOS/blog/701365
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞