由于iOS 7 SDK较早期版本的SDK改动较大,因此App的界面也会出现种种问题,其中最明显的问题就是状态栏与导航栏的显示问题。
一、状态栏
iOS 6:
iOS7:
当未使用导航栏时,上面的截图对比了在iOS 6与iOS 7上的显示情况。iOS 6中的状态栏不透明,视图控制器的主视图原点在状态栏下面。而iOS 7的状态栏背景色变为透明色,视图控制器的主视图原点在屏幕左上角,即状态栏显示在主视图之上,透过状态栏可以显示视图的内容。
如下图将视图的坐标设置为CGRectMake(0, 0, 300, 40)的效果如下
typedef NS_ENUM(NSInteger, UIStatusBarStyle)
{
UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds
UIStatusBarStyleLightContent NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds
UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
UIStatusBarStyleBlackOpaque NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
};
如果状态栏背景为浅色,应选用黑色字样式(UIStatusBarStyleDefault,默认值);如果背景为深色,则选用白色字样式(UIStatusBarStyleLightContent)。
二、隐藏状态栏
iOS7之前和iOS之后隐藏状态栏的方法是不同的。
第一种:
iOS7之前使用:
//iOS7以下版本隐藏UIStatusBar的方法:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
//PS:
//UIStatusBarAnimationNone //没有动画效果
//UIStatusBarAnimationFade //淡出
//UIStatusBarAnimationSlide //滑动
iOS7及之后使用:
PS:这里需要说明的是:
1、控制器不在导航栈或者在导航栈但导航条隐藏的状态下,下面的两个方法才会都被调用,
2、在导航栈有导航条的时候只有prefersStatusBarHidder方法会调用,preferredStatusBarStyle不会调用
总结一下就是有导航条preferredStatusBarStyle不调用,没有导航条preferredStatusBarStyle调用。
思考:怎么再有导航条的情况下改变状态栏的UIStatusBarStyle呢?
//升级到iOS7后的方法:
//在基类中重载UIViewController.h中的这个方法:
-(BOOL)prefersStatusBarHidden{
return NO;
}
//可同时重载此方法来设置状态栏的样式
-(UIStatusBarStyle)preferredStatusBarStyle{
// UIStatusBarStyleDefault//黑色
// UIStatusBarStyleLightContent//白色
// UIStatusBarStyleBlackTranslucent
// UIStatusBarStyleBlackOpaque
return UIStatusBarStyleDefault;
}
PS:在需要适配iOS7之前和iOS7及之后的版本,需要对系统版本做判断并选择不同的方法。
第二种:
另外一种方法是改变info.plist文件内容来达到设置状态栏是否隐藏如下图
info.plist文件中,
View controller-based status bar appearance项设为NO, 则以application的设置为准,view controller的prefersStatusBarHidden方法无效,是根本不会被调用的。
View controller-based status bar appearance项设为YES,则以View controller的prefersStatusBarHidden为准,application的设置无效,不会调用。
如果想要兼容iOS7之前、iOS7及之后:
View controller-based status bar appearance项设为NO,并用application来设置即可
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];//隐藏状态栏
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];//状态栏存在条件下,改变字体颜色
PS:通过此种方法,不管导航条是否存在,都能够改变状态栏的字体颜色
思考:View controller-based status bar appearance项设为YES 且有导航条的条件下,如何改变状态栏的字体颜色?
暂时还没找到方法。
参考文章:
1、 控制iOS 7中的状态栏
3、 UINavgationController中覆写preferredStatusBarStyle方法不执行的问题 文章中改变状态栏颜色的方法有问题。
来源:CSDN
作者:江湖hi客
链接:https://blog.csdn.net/gongwutianya/article/details/52234710