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

首頁 > 系統 > iOS > 正文

詳解在iOS App中自定義和隱藏狀態欄的方法

2020-07-26 03:26:04
字體:
來源:轉載
供稿:網友

自定義狀態欄

有時候,需要在狀態欄上顯示一些自定義信息,比如新浪微博的官方iOS客戶端:告知用戶信息處于發送隊列、發送成功或者發送失敗。

201631691517349.gif (320×480)

如上圖,通過在狀態欄顯示自定義信息,可以給用戶友好又不影響軟件使用的提示。

為此,我們顯得定義一個自定義狀態欄類,包含一個顯示信息的Label:

復制代碼 代碼如下:

@interface CustomStatusBar : UIWindow 

    UILabel *_messageLabel; 

 
- (void)showStatusMessage:(NSString *)message; 
- (void)hide; 
 
@end 

接著,設置大小和系統狀態欄一致,背景為黑色:
復制代碼 代碼如下:

self.frame = [UIApplication sharedApplication].statusBarFrame; 
self.backgroundColor = [UIColor blackColor]; 

到這里,為了讓自定義的狀態欄可以讓用戶看到,還需要設置它的windowLevel。
在iOS中,windowLevel屬性決定了UIWindow的顯示層次。默認的windowLevel為UIWindowLevelNormal,即0.0。

系統定義了三個層次如下,

復制代碼 代碼如下:

const UIWindowLevel UIWindowLevelNormal; 
const UIWindowLevel UIWindowLevelAlert; 
const UIWindowLevel UIWindowLevelStatusBar; 
typedef CGFloat UIWindowLevel; 

為了能夠覆蓋系統默認的狀態欄,我們把自定義的狀態欄的windowLevel調高點:
復制代碼 代碼如下:

self.windowLevel = UIWindowLevelStatusBar + 1.0f;


隱藏狀態欄

如果想要隱藏狀態欄,有兩種做法:

狀態欄是否隱藏默認由控制器管理,也就是說,當前狀態欄所對應的控制器決定是否隱藏狀態欄。

UIViewController中提供了一個prefersStatusBarHidden方法用于查看當前的控制器顯示的狀態欄是否隱藏,默認這個方法返回的是NO,也就是不隱藏。但是并沒有提供相應的方法來設置隱藏狀態欄。

這種情況我們可以重寫prefersStatusBarHidden方法,通過修改它的返回值達到目的。

復制代碼 代碼如下:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

這樣狀態欄就可以隱藏了。


另一種做法是不讓控制器來決定是否隱藏狀態欄,而是讓[UIApplication sharedApplication]來決定。

復制代碼 代碼如下:

[UIApplication sharedApplication].statusBarHidden = YES;

運行程序發現狀態欄并沒有隱藏。查看文檔可以發現:
復制代碼 代碼如下:

Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.

意思是如果使用默認的控制器管理狀態欄(第一種做法提到的),那么設置statusBarHidden是沒有效果的。想要關閉控制器的管理,需要我們給Info.plist增加一個key:
復制代碼 代碼如下:

View controller-based status bar appearance

并且設置為NO,這樣就可以通過設置statusBarHidden來隱藏狀態欄了。(這個key是Info.plist添加Key出現的下拉欄里的最后一個)


當控制器管理狀態欄時
復制代碼 代碼如下:

- (UIViewController *)childViewControllerForStatusBarHidden
- (UIViewController *)childViewControllerForStatusBarStyle

這兩個方法可以將狀態欄的控制權交給子控制器管理,如果返回nil則表示控制器自己來管理狀態欄;如果返回子控制器,則表示子控制器來管理狀態欄。比如在navigation controller中實現prefersStatusBarHidden方法可能并不管用,因為它可能默認在childViewControllerForStatusBarHidden中返回的是導航棧頂控制器,此時狀態欄由棧頂控制器來決定。如果想讓navigation controller來決定,那么可以在類中按下面的方式實現:
復制代碼 代碼如下:

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

此時,狀態欄的管理權在導航控制器。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平南县| 雅江县| 孟村| 皮山县| 阿克苏市| 安泽县| 阿克| 日喀则市| 通城县| 哈密市| 呼玛县| 乐至县| 五原县| 乐安县| 成武县| 西乌| 九龙坡区| 什邡市| 鄱阳县| 临夏县| 云阳县| 樟树市| 遵义市| 满城县| 南召县| 宣化县| 承德市| 大冶市| 长武县| 宜都市| 高唐县| 筠连县| 故城县| 米林县| 龙胜| 丘北县| 巴塘县| 江城| 德庆县| 油尖旺区| 华容县|