iOS 狀態欄和導航欄的控制

iOS的項目多數會遇到控制狀態欄和導航欄的問題,好比隱藏狀態欄、控制狀態欄的文字顏色等,導航欄也有一樣需求。ios

自從iOS7以後狀態欄就是透明的了 高度 20.f   導航欄的高度是 64.fapp

狀態欄的控制

狀態欄的設置分爲兩種: 1.全局設置 2.分頁面設置 控制這兩種模式的開關是info.plist文件的配置項。
1).Property List 下是 View controller-based status bar appearance 2).Source Code 下是 UIViewControllerBasedStatusBarAppearance字體

全局設置

在info.plist 文件中設置 View controller-based status bar appearance 爲NO 設置爲全局設置,即vc中的方法是沒法控制的,真正的控制方法以下:atom

//設置狀態欄字體顏色
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//設置狀態欄是否隱藏
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
/*
狀態欄字體顏色上呢  只是說改變對應枚舉值進行顏色設置 不能作任意修改 
   UIStatusBarStyleDefault     黑色                               
   UIStatusBarStyleLightContent 白色

狀態欄是否顯示,通常而言app不會對全部界面都不顯示狀態欄,而是隻在特定的頁面須要隱藏狀態欄,好比對於視頻播放界面不但願顯示狀態欄。

對於狀態欄的背景色設置,從ios7開始狀態欄自己其實是透明的,它的背景色其實取決於導航欄。
*/

分頁面設置

在info.plist 文件中設置 View controller-based status bar appearance 爲YES 設置爲分頁面VC設置控制,分兩種狀況: 1.VC不在UINavigationController 或者說VC是根控制器code

狀態欄字體顏色設置

//直接設置導航欄字體顏色
- (UIStatusBarStyle)preferredStatusBarStyle
{ 
    //返回白色
    return UIStatusBarStyleLightContent;
    //返回黑色
    //return UIStatusBarStyleDefault;
}

在view的某個加載階段好比viewWillAppear中,執行以下代碼,這樣更保險:orm

//刷新狀態欄
[self setNeedsStatusBarAppearanceUpdate];

隱藏控制

//直接設置
- (BOOL)prefersStatusBarHidden {
    return YES;
}

在view的某個加載階段好比viewWillAppear中,執行以下代碼,這樣更保險:視頻

[self setNeedsStatusBarAppearanceUpdate];

2.當VC在UINavigationController中時(或者是VC不是根控制器),VC並不能經過上面的方式控制狀態欄的顏色,須要經過以下方法間接控制:圖片

狀態欄字體顏色設置

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

隱藏控制

這個就比控制狀態欄字體顏色要複雜一些了,這個須要經過子VC控制根VC,從而達到控制根控制器的目的,方法以下: 假設根VC爲TabVC,那麼TabVC中要設置以下代碼get

//TabVC
//定義一個變量來控制狀態欄顯示,子VC經過修改這個值來間接控制
@property (nonatomic ,assign) BOOL statusBarHidden;

- (BOOL)prefersStatusBarHidden {
    return _statusBarHidden;
}

//子VC
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    
    if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
        [self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)];
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
        //注意對NO的狀況,不能傳@NO,只能傳nil才能被當成NO
        [self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil];
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

//能夠看到在子VC中經過設置根VC的屬性,並調用setNeedsStatusBarAppearanceUpdate後,根VC的prefersStatusBarHidden就會被調用,從而隱藏或顯示狀態欄。

導航欄

//iOS7 以後默認半透明
@property(nonatomic,assign,getter=isTranslucent) BOOL translucent //設置是否半透明 

//這是導航欄背景色 這個設置方法能夠在AppDelegate中設置,父類中設置,全局能夠生效。
[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]]; 
//導航欄背景色 控制器中也能夠這麼用
 [self.navigationController.navigationBar setBarTintColor:[UIColor yellowColor]];

//導航欄設置背景圖片 注意圖片高度 44.f 將不會設置狀態欄背景 64.f 可置頂部位置 所有設置
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault]; 

//導航欄標題設置
//能夠全局設置 在AppDelegate中 父類中
NSShadow *shadow = [[NSShadow alloc] init]; 
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8]; 
shadow.shadowOffset = CGSizeMake(0, 1); 
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
        [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName, 
        shadow, NSShadowAttributeName, 
        [UIFont fontWithName:@ "HelveticaNeue-CondensedBlack"  size:21.0], NSFontAttributeName, nil]];
//控制器中這麼設置也能夠
    [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:16.f],NSForegroundColorAttributeName:[UIColor WhiteColor]}];

//設置返回按鈕(等系統按鈕)能夠經過TintColor,直接來設置顏色
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
相關文章
相關標籤/搜索