iOS開發(fā)中膝蜈,我們經(jīng)常遇到改變狀態(tài)欄的情況(顯示不顯示,白底黑字键科,黑底白字等等)
第一種處理方式
由UIApplication處理浇衬,一種比較暴力的方式去處理
打開項(xiàng)目的.plist文件
上面的這種格式是蘋果默認(rèn)的格式,看著不是很爽十兢,我更喜歡下面的這種方式打開趣竣,當(dāng)然也可以以XML方式打開,看個(gè)人愛好了,添加UIViewControllerBasedStatusBarAppearance這個(gè)key旱物,value賦值為NO遥缕,字面意思:狀態(tài)欄的顯示不基于UIViewController,也就是說ViewController沒有改變狀態(tài)欄的權(quán)利
好的宵呛,準(zhǔn)備工作已經(jīng)做好了,直接上源碼:
感興趣的可以直接粘貼復(fù)制跑一下
//
// TestViewController.m
// status_bar_test
//
// Created by shaolin on 16/3/9.
// Copyright ? 2016年 shaolin. All rights reserved.
//
#import "FirstViewController.h"
@interface FirstViewController ()
@property (nonatomic,strong)UIButton* btn;
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"status bar test";
self.view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:self.btn];
}
- (UIButton*)btn {
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeSystem];
_btn.frame = CGRectMake(0, 64, 375, 100);
_btn.backgroundColor = [UIColor grayColor];
[_btn setTitle:@"test" forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
- (void)test {
static BOOL b = YES;
if (b) {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
} else {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}
b = !b;
}
@end
statusBarStyle单匣,蘋果提供了四個(gè)枚舉
但是,我給其賦值的時(shí)候看到了這樣的情況:
很顯然下面的兩個(gè)枚舉蘋果已經(jīng)不建議使用了
控制status bar是否顯示
[UIApplication sharedApplication].statusBarHidden = YES;
請(qǐng)注意
上面所有的操作都是基于sharedApplication的宝穗,所以修改后即為全局修改户秤,如果只想在某個(gè)ViewController使用,又想用這種暴力的方式逮矛,那就需要在VC生命周期的最后將其改變回來
第二種處理方式
status bar顯示控制權(quán)交給ViewController
#import "FirstViewController.h"
@interface FirstViewController ()
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
}
- (BOOL)prefersStatusBarHidden {
return NO;
}
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
@end
運(yùn)行結(jié)果:
請(qǐng)注意
當(dāng)我們的VC(ViewController的簡(jiǎn)稱)是基于UINavigationController這種形式的時(shí)候鸡号,這種處理方式只能控制status bar顯示不顯示,并不能控制其style须鼎,親測(cè)鲸伴,如下代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
FirstViewController* vc = [FirstViewController new];
UINavigationController* navVc = [[UINavigationController alloc]initWithRootViewController:vc];
self.window.rootViewController = navVc;
return YES;
}
//
// status_bar_test
//
// Created by shaolin on 16/3/9.
// Copyright ? 2016年 shaolin. All rights reserved.
//
#import "FirstViewController.h"
static BOOL b = NO;
@interface FirstViewController ()
@property (nonatomic,strong)UIButton* btn;
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"status bar test";
self.view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:self.btn];
}
- (UIButton*)btn {
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeSystem];
_btn.frame = CGRectMake(0, 64, 375, 100);
_btn.backgroundColor = [UIColor grayColor];
[_btn setTitle:@"test" forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationFade;
}
- (BOOL)prefersStatusBarHidden {
return b;
}
//- (UIStatusBarStyle)preferredStatusBarStyle {
// if (b) {
// return UIStatusBarStyleLightContent;
// }
// return UIStatusBarStyleDefault;
//}
- (void)test {
b = !b;
//這個(gè)方法會(huì)通知系統(tǒng)去調(diào)用當(dāng)前UIViewController的**preferredStatusBarStyle**方法
[self setNeedsStatusBarAppearanceUpdate];
}
@end
那這種情況下怎么去控制呢府蔗?
解決方案:
- 自定義一個(gè)UINavigationController
- 重寫 - (UIViewController *)childViewControllerForStatusBarStyle 方法
#import "MyNavController.h"
@interface MyNavController ()
@end
@implementation MyNavController
- (void)viewDidLoad {
[super viewDidLoad];
}
/**
* 默認(rèn)返回值為nil。
* 當(dāng)我們調(diào)用setNeedsStatusBarAppearanceUpdate時(shí)汞窗,系統(tǒng)會(huì)調(diào)用application.window的rootViewController的preferredStatusBarStyle
* 方法
* 我們的程序里一般都是用UINavigationController做root姓赤,如果是這種情況,那我們自己的UIViewController里的preferredStatusBarStyle根本不會(huì)被調(diào)用
* 這個(gè)時(shí)候不要調(diào)用我自己(就是UINavigationController)的preferredStatusBarStyle方法杉辙,而是去調(diào)用navigationController.topViewController的preferredStatusBarStyle方法
*
* @return stack最上層的vc模捂,我們知道navigation是以stack的形式跳轉(zhuǎn)的
*/
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
@end
AppDelegate.m文件,用自定義的NavigationController作為window的rootViewController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
FirstViewController* vc = [FirstViewController new];
MyNavController* navVc = [[MyNavController alloc]initWithRootViewController:vc];
self.window.rootViewController = navVc;
return YES;
}
效果圖:
附上GitHib源碼地址:
status_bar_test
如果兩種方式同時(shí)在項(xiàng)目中怎么辦?
取info.plist中 UIViewControllerBasedStatusBarAppearance中的設(shè)置:
NSNumber *isVCBasedStatusBarAppearanceNum = [[NSBundle mainBundle]objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"];
設(shè)為YES時(shí)isVCBasedStatusBarAppearanceNum值為1
設(shè)為NO時(shí)isVCBasedStatusBarAppearanceNum值為0
根據(jù)這個(gè)去處理你的邏輯哈
希望會(huì)給大家?guī)韼椭鶲(∩_∩)O