iOS開發(fā)之status bar

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é)果:

運(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

那這種情況下怎么去控制呢府蔗?
解決方案:

  1. 自定義一個(gè)UINavigationController
  2. 重寫 - (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;
}

效果圖:

效果圖.gif

附上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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜘矢,一起剝皮案震驚了整個(gè)濱河市狂男,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌品腹,老刑警劉巖岖食,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舞吭,居然都是意外死亡泡垃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門羡鸥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔑穴,“玉大人,你說我怎么就攤上這事惧浴〈婧停” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵衷旅,是天一觀的道長(zhǎng)捐腿。 經(jīng)常有香客問我,道長(zhǎng)柿顶,這世上最難降的妖魔是什么茄袖? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮嘁锯,結(jié)果婚禮上宪祥,老公的妹妹穿的比我還像新娘。我一直安慰自己家乘,他們只是感情好品山,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烤低,像睡著了一般肘交。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扑馁,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天涯呻,我揣著相機(jī)與錄音凉驻,去河邊找鬼。 笑死复罐,一個(gè)胖子當(dāng)著我的面吹牛涝登,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播效诅,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胀滚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了乱投?” 一聲冷哼從身側(cè)響起咽笼,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戚炫,沒想到半個(gè)月后剑刑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡双肤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年施掏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茅糜。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡七芭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔑赘,到底是詐尸還是另有隱情狸驳,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布米死,位于F島的核電站,受9級(jí)特大地震影響贮庞,放射性物質(zhì)發(fā)生泄漏峦筒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一窗慎、第九天 我趴在偏房一處隱蔽的房頂上張望物喷。 院中可真熱鬧,春花似錦遮斥、人聲如沸峦失。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尉辑。三九已至,卻和暖如春较屿,著一層夾襖步出監(jiān)牢的瞬間隧魄,已是汗流浹背卓练。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留购啄,地道東北人襟企。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狮含,于是被迫代替她去往敵國和親顽悼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容