一、UIViewControllerBasedStatusBarAppearance作用的实际测试
在作iOS7的适配时,很多文章都会提到UIViewControllerBasedStatusBarAppearance。便一直不是太明白其实际作用。在网上也没有查出明确的说明,苹果的官方文档也是说的不太清楚。在实际测试后发现UIViewControllerBasedStatusBarAppearance的实际作用如下:
这个属性只影响如何设置status bar上字体的颜色是黑色还是白色,对status bar的背景色无影响。status bar的背景色在iOS7上永远是透明的。
UIViewControllerBasedStatusBarAppearance = NO时:
UIApplication 的setStatusBarStyle方法生效:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
viewController的preferredStatusBarStyle方法无效:
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
UIViewControllerBasedStatusBarAppearance = YES时:
UIApplication 的setStatusBarStyle无效。
viewController的preferredStatusBarStyle方法有效。
apple官方说明:
UIViewControllerBasedStatusBarAppearance (Boolean - iOS) specifies whether the status bar appearance is based on the style preferred by the view controller that is currently under the status bar. When this key is not present or its value is set to YES, the view controller determines the status bar style. When the key is set to NO, view controllers (or the app) must each set the status bar style explicitly using the UIApplication object.
google自动翻译的经果:
UIViewControllerBasedStatusBarAppearance(布尔 - IOS)指定状态栏的外观是否是基于视图控制器,是目前在状态栏中的首选风格。当这个键不存在,或者它的值设置为YES时,视图控制器决定了状态栏的风格。当按键被设置为NO,视图控制器(或应用程序)都必须显式使用的UIApplication对象中的每个设置状态栏的风格。
二、ios7中让程序使用统一的status bar风格
状态栏
在iOS7中,状态栏是透明的,就是说,状态栏只有文字没有背景。
这个改动让我颇为意外,因为一直印象中苹果很care状态栏的,之前也曾听说过有应用因为遮挡了状态栏而被Appstore拒绝。
而且苹果之前状态栏提供的三种样式都是以深色底白色字呈现,保证了状态栏的内容清晰易读。
而变透明之后就很容易和后面的内容混淆,虽说一般应用不会把内容和状态栏叠合在一起,但是至少,现在的情况是,默认是会叠合的,开发需要从20px像素以下开始布局页面元素才能避免。
1、苹果为了让深色浅色背景均能让状态栏内容清晰显示,提供两种状态栏样式:
需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为NO;
UIStatusBarStyleDefault = 0 黑色文字,浅色背景时使用
UIStatusBarStyleLightContent = 1 白色文字,深色背景时使用
而以下两个旧状态栏样式将被废弃:
UIStatusBarStyleBlackTranslucent = 1
UIStatusBarStyleLightContent = 2
2、还有,iOS7中我们通过ViewController重载方法返回枚举值的方法来控制状态栏的隐藏和样式。
首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES;
然后,在UIViewController子类中实现以下两个方法:
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden
{
return NO;
}
最后,在需要刷新状态栏样式的时候,调用[self setNeedsStatusBarAppearanceUpdate]方法即可刷新,若果需要以动画形式切换状态栏样式,则用以下方式调用即可:
[UIView animateWithDuration:0. animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
三、status相关设置
1:statusBar字体为白色
在plist里面设置View controller-based status bar appearance 为 NO;设置statusBarStyle
为 UIStatusBarStyleLightContent
2:设置statusBar和navigationbar为一体
[nav.navigationBar setBackgroundImage:[UIImage imageNamed:@"bg_navbar.png"]
forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
// 1:statusBar字体为白色
// 在plist里面设置View controller-based status bar appearance 为 NO;设置statusBarStyle 为 UIStatusBarStyleLightContent
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// 2:设置statusBar和navigationbar为一体
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"Nav_back_image.jpg"] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
3:tabBarItem被选中没效果,需要调用sdk7中的方法: //兼容ios7以前
[viewController.tabBarItem setFinishedSelectedImage:actionMenu.selectedIcon
withFinishedUnselectedImage:actionMenu.icon];
//ios7的方法
viewController.tabBarItem.selectedImage = actionMenu.selectedIcon;
.h文件中
#import <UIKit/UIKit.h>
@interface InitailTalViewController : UITabBarController
@end
.m文件中
MineViewController *mineVC = [[MineViewController alloc]init];
mineVC.tabBarItem = [[UITabBarItem alloc]initWithTitle:@"我的" image:[UIImage imageNamed:@"4th_tab_mine_unselect"] tag:3];
selectImage = [UIImage imageNamed:@"4th_tab_mine_select"];
mineVC.tabBarItem.selectedImage = [selectImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UINavigationController *mineNavigation = [[UINavigationController alloc]initWithRootViewController:mineVC];
mineNavigation.navigationBar.translucent = NO;
self.viewControllers = @[parkNavgation,neighborNavgation,serviceNavigation,mineNavigation];
4:刷新状态栏statusBar
[self setNeedsStatusBarAppearanceUpdate]
iOS7里status bar的实现跟iOS6下有写不一样,前段时间碰到了这个问题,今天总结下
首先网上有很多解决办法,但是有些我觉得并没有按照苹果的思路来,比如把UIViewControllerBasedStatusBarAppearance在plist里设置为NO的方法,这个方法的确可行,但是并不是一个“正确”的思路,而且会有些问题,比如,当你在某个界面隐藏了status bar,退回到上一个界面时,status bar仍然是隐藏的
首先,苹果把UIViewControllerBasedStatusBarAppearance默认的值设为YES,是有他的道理的,新系统下,苹果希望我们的viewcontroller去控制status bar,也就是说,我们大多数的界面应该是统一的,偶尔一些viewcontroller需要status bar特殊控制的,完全交给当前的viewcontroller来做。
代码,其中_isFullScreen需要你在调用setNeedsStatusBarAppearanceUpdate
之前设置好相应的值
#pragma mark - Status Bar
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleDefault;
}
- (BOOL)prefersStatusBarHidden
{
return _isFullScreen;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation
{
return UIStatusBarAnimationSlide;
}
这样,当你想要控制status bar的展现形式时(不需要动画就去掉),只需要调用
[UIView animateWithDuration:.3 animations:^{
if (ISIOS7) {
[self setNeedsStatusBarAppearanceUpdate];
}
}];
注意:如果你使用了系统的UINavigationController,且它的navigationBar没有被隐藏的话,它的rootController及之后push的controller的preferredStatusBarStyle方法不会被调用(其他两个方法还是会被调用);
UINavigationController会根据自己navigationBar的barStyle,来决定StatusBarStyle的值;
如果你设置了self.navigationController.navigationBarHidden = YES;
那preferredStatusBarStyle就会被正常调用了。
5:navigationbar上面的BarButtonItem字看不见问题,backBarItem箭头没有,则需要 //ios7设置BarButtonItem字体颜色,则会显示出来,不包括返回箭头
[[UIBarButtonItem appearance]
setBackButtonTitlePositionAdjustment:UIOffsetMake(0, 0)
forBarMetrics:UIBarMetricsDefault];
//设置BarButtonItem颜色,包括返回箭头
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
6:取消ios7自带手势,比如navigationcontroller的右滑返回 self.navigationController.interactivePopGestureRecognizer.enabled = NO
;
注意:
如果在设置statusBarStyle时,却找不到UIStatusBarStyleLightContent
只好在代码里边设置 if(isIOS7) application.statusBarStyle =
UIStatusBarStyleLightContent;
nav.navigationBar.barStyle =
UIBarStyleBlackTranslucent;//设置bar的风格,控制字体颜色