iOS状态栏的设置statusBarStyle
2018-01-05 11:04
211 查看
关于状态栏statusBar颜色以及隐藏的设置,网上已经有很多答案了。由于本项目中对状态栏的修改是基于iOS9.0以上的设置,故整理一篇博客,希望能帮助有需要的同学。
首先介绍一下iOS9.0之前的设置:
在我们新建APP的时候,在General-Deployment Info-Status Bar Style这里有默认的全局设置,Default是黑色。Light是白色。
iOS9 之前我们通常在Info.plist中添加一个View controller-based status bar appearance设置选项,设置为NO这样就可以使用上边的方法了
在info.plist中可以设置状态栏的外观是否是基于视图控制器,键的名称就是UIViewControllerBasedStatusBarAppearance,如果不设置那么它的默认值是YES,表示视图控制器决定了状态栏的风格;如果值设置为NO,则表示每个视图控制器必须显式地使用UIApplication对象来设置状态栏的风格。
statusBarStyle 状态栏的颜色 statusBarHidden 状态栏是否隐藏
故设置状态栏白色 隐藏可通过UIApplication 调用
总结一下,如果想改变StatusBar的显示风格,把UIViewControllerBasedStatusBarAppearance设置为NO,然后通过UIApplication对象设置StatusBar 的 Style就可以了。
但是上面的方法iOS9 之后就过期了,我们需要用他们提供的方法进行替换,注释里已经提示Use -[UIViewController prefersStatusBarHidden]这是iOS7之后苹果在UIViewController里添加的新方法,这么做的目的可以让开发者更加灵活的自定义每个ViewController的状态栏。
下面的方法是在ViewController中进行重写
调用上边的方法时需要调用[self setNeedsStatusBarAppearanceUpdate]函数来重绘状态栏,如果上边的方法不起作用,系统也给我们提供了一个函数, 可以解决这个问题
是因为我们通常使用的viewController都是嵌套在UINavigationController中使用的,这个函数的返回值默认为nil,在我们嵌套了UINavigationController的时候,AppDelegate.window.rootViewController通常是我们创建navigationController,这时首先会调用navigationController中的childViewControllerForStatusBarStyle函数,因为默认返回nil,那么接下来就会调用ViewController本身的preferredStatusBarStyle函数,所以我们在viewController中通过preferredStatusBarStyle函数设置的状态栏样式就不会被调用,所以也就无效了。
所以我们自己要创建一个继承于UINavigationcontroller的NavigationController,在这个子类中重写childViewControllerForStatusBarStyle函数,根据自己情况,也可在父类中进行设置
这样navigationController中的childViewControllerForStatusBarStyle函数会返回navigationController中最上层的viewController,那么viewController中的preferredStatusBarStyle函数的设置就会被系统获知。
childViewControllerForStatusBarHidden函数的使用原理同上,不再赘述。
借鉴作者:MajorLMJ
来源:简书
链接:https://www.jianshu.com/p/4196d7cf95f4
首先介绍一下iOS9.0之前的设置:
在我们新建APP的时候,在General-Deployment Info-Status Bar Style这里有默认的全局设置,Default是黑色。Light是白色。
// Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system. 苹果提示开发者如果使用的是系统基础的状态栏样式你的这些设置是不生效的 @property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED; - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED; @property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED; - (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_DEPRECATED_IOS(3_2, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
iOS9 之前我们通常在Info.plist中添加一个View controller-based status bar appearance设置选项,设置为NO这样就可以使用上边的方法了
在info.plist中可以设置状态栏的外观是否是基于视图控制器,键的名称就是UIViewControllerBasedStatusBarAppearance,如果不设置那么它的默认值是YES,表示视图控制器决定了状态栏的风格;如果值设置为NO,则表示每个视图控制器必须显式地使用UIApplication对象来设置状态栏的风格。
statusBarStyle 状态栏的颜色 statusBarHidden 状态栏是否隐藏
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, } __TVOS_PROHIBITED;
故设置状态栏白色 隐藏可通过UIApplication 调用
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; [UIApplication sharedApplication].statusBarHidden = YES;
总结一下,如果想改变StatusBar的显示风格,把UIViewControllerBasedStatusBarAppearance设置为NO,然后通过UIApplication对象设置StatusBar 的 Style就可以了。
但是上面的方法iOS9 之后就过期了,我们需要用他们提供的方法进行替换,注释里已经提示Use -[UIViewController prefersStatusBarHidden]这是iOS7之后苹果在UIViewController里添加的新方法,这么做的目的可以让开发者更加灵活的自定义每个ViewController的状态栏。
下面的方法是在ViewController中进行重写
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } - (BOOL)prefersStatusBarHidden { return NO; }
调用上边的方法时需要调用[self setNeedsStatusBarAppearanceUpdate]函数来重绘状态栏,如果上边的方法不起作用,系统也给我们提供了一个函数, 可以解决这个问题
(UIViewController *)childViewControllerForStatusBarStyle
是因为我们通常使用的viewController都是嵌套在UINavigationController中使用的,这个函数的返回值默认为nil,在我们嵌套了UINavigationController的时候,AppDelegate.window.rootViewController通常是我们创建navigationController,这时首先会调用navigationController中的childViewControllerForStatusBarStyle函数,因为默认返回nil,那么接下来就会调用ViewController本身的preferredStatusBarStyle函数,所以我们在viewController中通过preferredStatusBarStyle函数设置的状态栏样式就不会被调用,所以也就无效了。
所以我们自己要创建一个继承于UINavigationcontroller的NavigationController,在这个子类中重写childViewControllerForStatusBarStyle函数,根据自己情况,也可在父类中进行设置
-(UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
这样navigationController中的childViewControllerForStatusBarStyle函数会返回navigationController中最上层的viewController,那么viewController中的preferredStatusBarStyle函数的设置就会被系统获知。
childViewControllerForStatusBarHidden函数的使用原理同上,不再赘述。
借鉴作者:MajorLMJ
来源:简书
链接:https://www.jianshu.com/p/4196d7cf95f4
相关文章推荐
- iOS设置状态栏样式,statusBarStyle
- IOS上 关于状态栏的相关设置(UIStatusBar)和preferredStatusBarStyle不执行问题
- iOS设置状态栏样式,显示控制,statusBarStyle, statusBar
- 使用 preferredStatusBarStyle 设置状态栏颜色
- IOS上 关于状态栏的相关设置(UIStatusBar)
- iOS - UINavgationController中preferredStatusBarStyle方法不执行的问题
- iOS swift 状态栏UIStatusBar颜色设置
- ios 屏幕,状态栏(statusbar),程序窗口 尺寸获取和屏幕旋转时的尺寸变化
- IOS上 关于状态栏的相关设置(UIStatusBar)
- iOS之statusBar状态栏
- IOS-UITableViewStyle设置Group、Plain问题
- React Native ios 设置状态栏文本颜色
- cordova-plugin-statusbar状态栏设置整理
- ios 状态栏、菜单颜色设置 modal push tabBar navBar toolBar
- ios 设置状态栏字体颜色为白色
- iOS 7设置状态栏样式
- IOS-UITableViewStyle设置Group、Plain问题
- iphone ios 屏幕,statusbar,状态栏的高度
- 01- - -1.获得项目中info.plist文件的内容 2.沙盒的数据存储及读取 3.控制器view的高度和状态栏statusBar的关系 4.[UIScreen mainScreen].applicationFrame的取值 5.按钮的状态 6.错误调试技巧 7.按钮的各种状态设置
- iOS开发之顶部状态栏statusBar颜色变化小结