iOS基礎:修改app狀態欄顏色以及原生的導航欄顏色

<1>設置狀態欄文字顏色以及背景顏色

這個設置引用自鏈接:https://www.jianshu.com/p/889cff2b3a52

蘋果目前狀態欄目前有兩種狀態顏色

iOS7以後

狀態欄的字體爲黑色:UIStatusBarStyleDefault

狀態欄的字體爲白色背景:UIStatusBarStyleLightContent

解決方案

1、在info.plist中,將View controller-based status bar appearance 設爲 NO

狀態欄字體的顏色只由下面的屬性設定,默認爲白色:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;

 

解決個別vc中狀態欄字體顏色不同的辦法(即將顯示頁面的時候改成要的顏色,即將消失的時候再改回統一的顏色)

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

}

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;

}

2、在info.plist中,將View controller-based status bar appearance 設爲 YES

在info.plist中 View controller-based status bar appearance 的 默認值就是YES

如果View controller-based status bar appearance爲YES 時 [UIApplication sharedApplication].statusBarStyle 無效。

1、在vc中重寫vc的preferredStatusBarStyle方法
    -(UIStatusBarStyle)preferredStatusBarStyle {
        return UIStatusBarStyleDefault;
    }
2、在viewDidload中調用:
    [self setNeedsStatusBarAppearanceUpdate];

可能出現的問題:

當vc在nav中時,上面方法沒用,vc中的preferredStatusBarStyle方法根本不用被調用。

原因是,[self setNeedsStatusBarAppearanceUpdate]發出後,只會調用navigation controller中的preferredStatusBarStyle方法,vc中的preferredStatusBarStyley方法跟本不會被調用。

解決辦法有兩個:

方法一:

    設置 navbar 的barStyle 屬性會影響status bar 的字體和背景色。如下。

    //status bar的字體爲白色 ,導航欄的背景色是黑色。

    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

    //status bar的字體爲黑色 ,導航欄的背景色是白色,狀態欄的背景色也是白色。

    self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    
方法二:

    自定義一個navController的子類,在這個子類中重寫preferredStatusBarStyle方法:

    MyNav* nav = [[MyNav alloc] initWithRootViewController:vc];

    self.window.rootViewController = nav;

    @implementation MyNav

    - (UIStatusBarStyle)preferredStatusBarStyle {
        UIViewController* topVC = self.topViewController;
        return [topVC preferredStatusBarStyle];
    }

隱藏某個控制器的狀態欄
1.View controller-based status bar appearance  = NO
[[UIApplication sharedApplication] setStatusBarHidden:hidden];

2.View controller-based status bar appearance  = YES
-  (BOOL)prefersStatusBarHidden {
    return YES;
}

3.設置Status bar is initially hidden = YES
可以隱藏啓動頁展示過程的狀態欄。

<2>設置導航欄顏色--就是原生navigationBar背景顏色,字體顏色

其實用原生的話,如果設計沒毛病,不改來改去還好,一套統一的bar顏色安安全全下來。完美。

但是如果設計這個頁面要白色,那個頁面要黃色,另一個頁面要花色,就比較坑了,也不是原生不能改,只是寫起來代碼會多點,建議有個做個navigationController基類,封裝個方法來處理。

再有空點,就自己寫個假的bar,搞掉系統的,用自己假bar來處理,就不用這個多代碼了,但是自己寫的話,需要自己處理很多東西,比如按鈕的大小適配了,文字的大小適配了,上面的view的寬高了。

用原生的bar修改顏色的話,代碼上吧:

       [self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor colorFromHex:kNavBarNewColor] andSize:CGSizeMake(1, 64)] forBarMetrics:UIBarMetricsDefault];
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = [UIColor colorFromHex:kNavBarNewColor];
    }
    [self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:[UIColor colorFromHex:kNavBarNewColor]]];
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor]};
  
 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章