首页 > 系统 > iOS > 正文

iOS-UIStatusBar详细总结

2019-11-08 00:18:33
字体:
来源:转载
供稿:网友

1、UIStatusBar简介

iOS上的statusBar就是指的最上面的20像素高的部分,分为两个部分 - 前景部分:就是指显示信号、时间、电量等的状态部分 - 后景部分:就是显示黑色或者图片的背景部分

2、UIStatusBar前景

2.1 UIStatusBarStyle

UIStatusBar的前景部分实际就是通过UIStatusBarStyle来修改,iOS7之后就两种style,

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 白色字体

2.2 修改启动页的UIStatusBarStyle

【General】 –>【Deployment Info】–>【Status Bar Style】 启动页statusBar.png 此处可设置启动页的statusBarStyle以及hidden属性,Requires full screen在支持分屏多任务时需要勾选。Info.plist处修改 Info.png

**两处修改是同步的,修改其中一处,另一处会随之变化。 此处的修改只针对启动页有效,对viewController不起作用。**

2.3 viewController的UIStatusBarStyle

修改viewController的statusBar有两种方式 - 方式一:通过viewController的-(UIStatusBarStyle)preferredStatusBarStyle方法 - 方式二:通过UIapplication方式

重点强调: Info.plist里有个View controller-based stats bar appearance属性,没有可以自己添加,默认是YES,表示通过方式一设置的UIStatusBarStyle优先级高于方式二,当设为NO时反之。

2.3.1方式一详解

此时View controller-based stats bar appearance值要为YES,此值默认是YES,Info.plist没添加该属性时,即为YES 主要有五个方法,在ViewController里重写即可。

//返回statusBarStyle- (UIStatusBarStyle)preferredStatusBarStyle//返回是否Hidden- (BOOL)prefersstatusBarHidden//更新statusBarStyle- (void)setNeedsStatusBarAppearanceUpdate//- (nullable UIViewController *)childViewControllerForStatusBarStyle;- (nullable UIViewController *)childViewControllerForStatusBarHidden;

这里说明一下setNeedsStatusBarAppearanceUpdatechildViewControllerForStatusBarStyle两个方法。 1. - (void)setNeedsStatusBarAppearanceUpdate 如果在viewController已经显示在当前页面,你可能还要在当前页面不时的更改statusBar的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewControllerpreferredStatusBarStyle方法),从而改变statusBarstatusBarStyle。 具体用法:

-(void)changeStatsBar { _isChange = !_isChange; [self setNeedsStatusBarAppearanceUpdate]; }-(UIStatusBarStyle)preferredStatusBarStyle { return _isChange?UIStatusBarStyleLightContent:UIStatusBarStyleDefault;}- (nullable UIViewController *)childViewControllerForStatusBarStyle; 这个接口也很重要,默认返回值为nil。当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用application.windowrootViewControllerpreferredStatusBarStyle方法,我们的程序里一般都是用navigationControllerroot,如果是这种情况,那我们自己的viewController里的preferredStatusBarStyle根本不会被调用。这种情况下我们需要在navigationController里重写该方法,返回当前正在显示的viewController. 如:-(nullable UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController;}

这里再次强调一下: 当用navigationController做root时,在viewController里重写上述几个方法是无效的,如若单独改变某个viewControllerstatusBarStyle必须在navigationController里重写childViewControllerForStatusBarStyle方法实现

2.3.2方式二详解

首先设置View controller-based stats bar appearance值为NO,否则通过此方式设置的属性都不会生效。 在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法里设置相关属性方法开更改statusBar的style和hidden

@interface UIApplication(UIApplicationDeprecated)// 显示设置statusBarOrientation@property(readwrite, nonatomic) UIInterfaceOrientation statusBarOrientation;- (void)setStatusBarOrientation:(UIInterfaceOrientation)interfaceOrientation animated:(BOOL)animated;// 设置statusBarStyle@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle;- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated;//设置statusBarHidden@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation;@end

通过UIApplication的方式,我们发现在iOS9以后全部都废除了,看来苹果官方并不推荐我们这么做。UIApplication的方式是一种全局控制,这样的方式也确实不怎么好。

3、更改UIStatusBar后景

3.1 默认方式

UIStatusBar的背景默认会显示navigationBar的背景或self.view的背景。所以可以通过修改navigationBarself.view的背景修改statusBar的背景。

当有navigationBar时,通过下面两个方法修改: setBarTintColor - (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics 关于navigationBar背景颜色的问题,更加详细的内容可以参考IOS-UINavigationController详解

没有navigationBar时,通过self.view.backgroundColor修改。

3.2 KVO的方式修改

方法如下:

-(void)setStatusBarBackgroundColor:(UIColor *)color { UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; NSLog(@"statusBar.backgroundColor--->%@",statusBar.backgroundColor); if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) { statusBar.backgroundColor = color; }}

此方法修改过后,如无特别设置,其余所有的statusBar都会该设置后的颜色。

3.3 UIView覆盖statusBar的方式

方法如下:

-(void)setStatusBarBackgroundColor:(UIColor *)color { UIView * statusBarView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, -20)]; statusBarView.backgroundColor = [UIColor orangeColor]; [self.navigationController.navigationBar addSubview:statusBarView];}

只修改当前navigationController的statusBar

参考文章: ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏 iOS7下隐藏status bar的详细研究 ios 状态栏statusBar的背景颜色


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表