1. 状态栏设置
对状态栏的控制分两种情况:全局设置和分页面设置。控制两种模式的开关是info.plist文件的View controller-based status bar appearance配置项。
1.1 NO:全局设置状态栏。
控制器中对状态栏的控制都将无效,通过下面代码在 didFinishLaunchingWithOptions 中设置
//设置状态栏的字体颜色模式
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
//设置状态栏是否隐藏
[[UIApplication sharedApplication] setStatusBarHidden:YES];
状态栏的背景色取决于导航栏的背景色
状态栏的字体颜色只有2种:UIStatusBarStyleLightContent 和 UIStatusBarStyleDefault。
注意:iOS9中 setStatusBarStyle 已经过期,默认状态栏归当前控制器管理。若想全局设置,又受不了警告,可以忽略
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
#pragma clang diagnostic pop
1.2 YES: 分页设置状态栏。
由各控制器来控制状态栏的功能,在这种模式下,全局的设置将无效!!所以我们必须逐个页面对状态栏进行设置,否则状态栏将维持默认的黑色字体和默认为显示状态。
1.2.1 分页字体设置
(1) 当VC不在UINavigationController中时,实现下面方法:
- (UIStatusBarStyle)preferredStatusBarStyle{
//返回白色
return UIStatusBarStyleLightContent;
//返回黑色
//return UIStatusBarStyleDefault;
}
保险起见,在view的某个加载阶段比如viewWillAppear中,调用:
[self setNeedsStatusBarAppearanceUpdate];
(2) 当VC在UINavigationController中时,VC并不能通过(1)的方式控制状态栏的颜色,有一个trick的方法可以在VC中间接的控制
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
1.2.2 设置是否隐藏
(1) 如果是VC本身就是根控制器,实现下面方法:
- (BOOL)prefersStatusBarHidden {
return YES;
}
同样保险起见,在viewWillAppear中,调用:
[self setNeedsStatusBarAppearanceUpdate];
(2) 如果VC不是根控制器,那么不像控制字体颜色那样有trick,我们只能间接的通过在子VC中控制根VC,从而间接控制根控制器。
例如 :我的根VC是个tabCon,首先在根tabCon中,实现(1):
@interface YYCTabBarController : RDVTabBarController
//定义一个变量来控制状态栏显示,子VC通过修改这个值来间接控制
@property (nonatomic,assign)BOOL statusBarHidden;
@end
@implementation YYCTabBarController
-(BOOL)prefersStatusBarHidden {
return _statusBarHidden;
}
@end
在子VC,即当前要设置的控制器中:
[super viewWillAppear:animated];
//rdv_tabBarController指向YYCTabBarController
if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
[self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)];
[self setNeedsStatusBarAppearanceUpdate];
}
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
//注意对NO的情况,不能传@NO,只能传nil才能被当成NO
[self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil];
[self setNeedsStatusBarAppearanceUpdate];
}
}
2. 导航栏设置
2.1 背景设置
(1) 背景色 :barTintColor属性
全局设置:在 didFinishLaunchingWithOptions 中
[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]];
单独设置:在对应控制器中
self.navigationController.navigationBar.barTintColor = NavColor;
(2) 背景图片:setBackgroundImage(注意高度问题,ios7导航栏的高度其实是算上状态栏的,即44+20=64个点的高度)
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault];
2.2 前景设置
(1) 标题设置:(颜色字体)
标题设置相对比较复杂一些,属性字典格式为:
[NSDictionary dictionaryWithObjectsAndKeys: 属性值1,属性名1,属性值2,属性名2,nil];
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);
NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor], NSForegroundColorAttributeName,
shadow, NSShadowAttributeName,
[UIFont fontWithName:@"HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil];
[[UINavigationBar appearance] setTitleTextAttributes:textAttributes];
(2) 系统按钮设置:(颜色)
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
(3) 系统按钮设置:(颜色字体)
NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont boldSystemFontOfSize:14],NSFontAttributeName,
KTitleWhiteColorFromRGB, NSForegroundColorAttributeName, nil];
[self.navigationItem.rightBarButtonItem setTitleTextAttributes:textAttributes forState:UIControlStateNormal];
2.3 显示设置
设置某VC不显示navigationBar,不显示tabBar,进入VC时改变导航栏的显示状态,而退出时还原:
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController.navigationBar setHidden:YES];
[self.rdv_tabBarController setTabBarHidden:YES animated:NO];
}
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.navigationController.navigationBar setHidden:NO];
[self.rdv_tabBarController setTabBarHidden:NO animated:NO];
}
2.4 在有导航栏NavigationBar时定位控件的Y
其他控件:无影响
UIScrollView:VC会对其内部的UIScrollView的内容部分进行一个Inset,这个Inset在上半部分刚好就对应导航栏的高度,包括:UIScrollView,UITableView,UITextView等。这时可视范围的Y坐标就是从64开始的。
解决:
self.automaticallyAdjustsScrollViewInsets = NO;