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;
//子VC - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated];
if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){ [self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)]; [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]]; ```