国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

深入理解iOS的狀態(tài)欄

2020-07-26 03:10:26
字體:
供稿:網(wǎng)友

一、狀態(tài)欄的隱藏

狀態(tài)欄的隱藏主要有兩種方法,下面來一起看看吧。

方法一:通過代碼控制

@interface UIApplication(UIApplicationDeprecated)// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED; // use -setStatusBarHidden:withAnimation:- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_DEPRECATED_IOS(3_2, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;

注意:讓我們先來看看// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.這個(gè)注釋提示,蘋果提示開發(fā)者如果使用的是系統(tǒng)基礎(chǔ)的狀態(tài)欄樣式你的這些設(shè)置是不生效的,在接下來要介紹的通過Info.plist隱藏狀態(tài)欄同樣要注意這件事。

Info.plist中添加一個(gè)View controller-based status bar appearance設(shè)置選項(xiàng),設(shè)置為NO這樣就可以使用上邊的方法了

注意:添加的View controller-based status bar appearanceBool類型,默認(rèn)為Yes,很不幸iOS9之后蘋果已經(jīng)不推薦使用這些方法了,這些方法能用但是會報(bào)警告。

那么這些方法被禁用以后,如何操作呢?注釋里已經(jīng)提示Use -[UIViewController prefersStatusBarHidden]這是iOS7之后蘋果在UIViewController里添加的新方法,這么做的目的可以讓開發(fā)者更加靈活的自定義每個(gè)ViewController的狀態(tài)欄。

- (BOOL)prefersStatusBarHidden{  return YES;}

iOS7之后UIViewController中不只提供了這個(gè)關(guān)于狀態(tài)欄的設(shè)置的函數(shù),還有其他的,后面詳細(xì)說。

方法二:通過Info.plist控制

1,首先我們依然要設(shè)置這個(gè)(第2步中的兩種方式都要設(shè)置這個(gè)參數(shù))

2,然后設(shè)置(兩種方式)

或者

兩者是等效的!并且兩者的狀態(tài)是同步的。

二、狀態(tài)欄樣式

先看看都有哪些樣式(解釋看注釋)

typedef NS_ENUM(NSInteger, UIStatusBarStyle) {//默認(rèn)樣式,黑字透明狀態(tài)欄,適合用于背景色為亮色的頁面  UIStatusBarStyleDefault                   = 0, // Dark content, for use on light backgrounds//白字透明狀態(tài)欄,適合用于背景色為暗色的頁面  UIStatusBarStyleLightContent   NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds// iOS7.0以前黑底白字,iOS7以后跟UIStatusBarStyleLightContent效果一樣  UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,// iOS7.0以前啟動頁為灰底白字,iOS7以后跟UIStatusBarStyleLightContent效果一樣  UIStatusBarStyleBlackOpaque   NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,} __TVOS_PROHIBITED;

如何設(shè)置狀態(tài)欄樣式

// Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system.@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED;- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED;

同樣iOS9以后這些方法被禁用了,蘋果推薦在具體的viewControllerUse -[UIViewController preferredStatusBarStyle]

- (UIStatusBarStyle)preferredStatusBarStyle{  return UIStatusBarStyleLightContent;}

注意:我們通常使用的viewController都是嵌套在UINavigationController中使用的,此時(shí)在viewController中使用- (UIStatusBarStyle)preferredStatusBarStyle;函數(shù)會發(fā)現(xiàn)設(shè)置并沒有生效。

系統(tǒng)也給我們提供了一個(gè)函數(shù)- (UIViewController *)childViewControllerForStatusBarStyle,也可以解決這個(gè)問題,后面會講。

三、背景色

iOS7以后默認(rèn)情況下狀態(tài)欄的背景為透明的,一種辦法是我們自己寫一個(gè)UIView作為背景添加到狀態(tài)欄下面,這樣就可以隨意設(shè)置狀態(tài)欄的顏色了。

另一種方法就是通過設(shè)置navigationBarsetBarTintColor顏色來改變狀態(tài)欄顏色

UIViewController中其他有關(guān)狀態(tài)欄的函數(shù)

preferredStatusBarUpdateAnimation函數(shù)

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade

如果想在當(dāng)前已經(jīng)顯示的UIViewController中更改狀態(tài)欄的樣式的話,需要調(diào)用以上函數(shù)。調(diào)用該函數(shù)后,系統(tǒng)會主動調(diào)用preferredStatusBarStyle方法重繪狀態(tài)欄的樣式

childViewControllerForStatusBarStyle函數(shù)

// Override to return a child view controller or nil. If non-nil, that view controller's status bar appearance attributes will be used. If nil, self is used. Whenever the return values from these methods change, -setNeedsUpdatedStatusBarAttributes should be called.- (nullable UIViewController *)childViewControllerForStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

這個(gè)函數(shù)的返回值默認(rèn)返回nil,此時(shí)系統(tǒng)就會調(diào)用當(dāng)前viewControllerApreferredStatusBarStyle函數(shù);如果返回值是另一個(gè)viewControllerB那么系統(tǒng)就會調(diào)用viewControllerBpreferredStatusBarStyle函數(shù)。

運(yùn)用這個(gè)函數(shù)就可以解決嵌套UINavigationController設(shè)置樣式無效的問題。

解釋一下為什么嵌套UINavigationControllerviewControllerpreferredStatusBarStyle函數(shù)設(shè)置無效:

在我們嵌套了UINavigationController的時(shí)候,我們的AppDelegate.window.rootViewController通常是我們創(chuàng)建的navigationController,這時(shí)首先會調(diào)用的是navigationController中的childViewControllerForStatusBarStyle函數(shù),因?yàn)槟J(rèn)返回nil,那么接下來就會調(diào)用navigationController本身的preferredStatusBarStyle函數(shù),所以我們在viewController中通過preferredStatusBarStyle函數(shù)設(shè)置的狀態(tài)欄樣式就不會被調(diào)用發(fā)現(xiàn),所以也就無效了。

所以我們要自己創(chuàng)建一個(gè)繼承于UINavigationcontrollerNavigationController,在這個(gè)子類中重寫childViewControllerForStatusBarStyle函數(shù)

- (UIViewController *)childViewControllerForStatusBarStyle{  return self.topViewController;}

這樣navigationController中的childViewControllerForStatusBarStyle函數(shù)會返回navigationController中最上層的viewController,那么viewController中的preferredStatusBarStyle函數(shù)的設(shè)置就會被系統(tǒng)獲知

childViewControllerForStatusBarHidden函數(shù)

- (nullable UIViewController *)childViewControllerForStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

childViewControllerForStatusBarHidden函數(shù)的使用原理同上,不再贅述。

preferredStatusBarUpdateAnimation函數(shù)

// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade

動畫形式如下

typedef NS_ENUM(NSInteger, UIStatusBarAnimation) {  UIStatusBarAnimationNone,  UIStatusBarAnimationFade NS_ENUM_AVAILABLE_IOS(3_2),  UIStatusBarAnimationSlide NS_ENUM_AVAILABLE_IOS(3_2),} __TVOS_PROHIBITED;

這個(gè)函數(shù)返回了動畫效果。動畫效果只有在prefersStatusBarHidden函數(shù)返回值變化的時(shí)候才會展示,同時(shí)要通過調(diào)用
[self setNeedsStatusBarAppearanceUpdate]函數(shù)來重繪狀態(tài)欄

四、應(yīng)用

我們可以通過隱藏系統(tǒng)狀態(tài)欄,然后自定義UIWindow通過設(shè)置setWindowLevel:UIWindowLevelStatusBar實(shí)現(xiàn)自定義狀態(tài)欄。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望能對各位iOS開發(fā)者們有所幫助,如果有疑問大家可以留言交流。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 昌图县| 休宁县| 隆林| 建湖县| 扎兰屯市| 花垣县| 新泰市| 哈巴河县| 砚山县| 河北省| 长治县| 安阳市| 淳安县| 许昌市| 邵东县| 交城县| 宁河县| 清丰县| 嘉黎县| 武宣县| 特克斯县| 九江市| 忻州市| 修文县| 侯马市| 屯留县| 互助| 颍上县| 成安县| 苍梧县| 大方县| 如皋市| 池州市| 萝北县| 天气| 漳平市| 嘉兴市| 普安县| 巴塘县| 察哈| 河间市|