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]];