1、全局初始化設(shè)置statusBar的顏色
在 Info.plist 里增加一行 UIStatusBarStyle或者Status bar style,然后可以選擇你想要設(shè)置的風(fēng)格,設(shè)置可以從啟動(dòng)應(yīng)用時(shí)就影響statusBar的顏色。
ps:啟動(dòng)頁(yè)的時(shí)候的顏色只能通過(guò)這個(gè)參數(shù)控制。
2、局部頁(yè)面修改statusBar的顏色
很多情況下我們可能需要單獨(dú)設(shè)置某個(gè)頁(yè)面的statusBar的顏色,我們需要在Info.plist 里增加一行View controller-based status bar appearance
設(shè)置為YES,則控制器對(duì)狀態(tài)欄設(shè)置的優(yōu)先級(jí)高于application,我們可以通過(guò)重寫每個(gè)UIViewController里的- (UIStatusBarStyle)preferredStatusBarStyle。
設(shè)置為NO,則以application為準(zhǔn),我們需要通過(guò)設(shè)置[UIApplication sharedApplication].statusBarStyle來(lái)修改控制器的顏色
YES的情況下,如果控制器是在UINavigationController堆棧中的,那么這個(gè)設(shè)置會(huì)無(wú)效,我們都知道UINavigationController是繼承自UIViewController,因此也會(huì)有這個(gè)方法,使得具體的UIViewController無(wú)效。
上面的情況的解決方法:
方法一:
自定義自己的導(dǎo)航控制器繼承UINavigationController,然后重寫方法
- (UIStatusBarStyle)preferredStatusBarStyle
{
return self.topViewController.preferredStatusBarStyle;
}
將工程內(nèi)的系統(tǒng)的UINavigationController全部替換成自己創(chuàng)建的,這樣控制器里的- (UIStatusBarStyle)preferredStatusBarStyle就可以生效了,如控制器里沒(méi)有實(shí)現(xiàn)該方法就會(huì)顯示Default的風(fēng)格
方法二:
第一種方法會(huì)比較麻煩,而且如果是老的項(xiàng)目修改起來(lái)會(huì)非常麻煩,我們也可以通過(guò)穿件分類Category和方法替換swizzleMethod來(lái)實(shí)現(xiàn)
第一步:先創(chuàng)建一個(gè)UINavigationController的分類
第二步:重寫 + (void)load方法,在方法中替換- (UIStatusBarStyle)preferredStatusBarStyle方法,并實(shí)現(xiàn)被替換進(jìn)去的- (UIStatusBarStyle)topViewControllerPreferredStatusBarStyle
+ (void)load
{
swizzleMethod(self, @selector(preferredStatusBarStyle), @selector(topViewControllerPreferredStatusBarStyle));
}
- (UIStatusBarStyle)topViewControllerPreferredStatusBarStyle
{
return self.topViewController.preferredStatusBarStyle;
}
上面方法中的宏定義如下,想要了解swizzleMethod的可以去學(xué)習(xí)runtime的相關(guān)知識(shí)
#define swizzleMethod(class, originalSelector, swizzledSelector) { \
Method originalMethod = class_getInstanceMethod(class, (originalSelector)); \
Method swizzledMethod = class_getInstanceMethod(class, (swizzledSelector)); \
if (!class_addMethod((class), \
(originalSelector), \
method_getImplementation(swizzledMethod), \
method_getTypeEncoding(swizzledMethod))) { \
method_exchangeImplementations(originalMethod, swizzledMethod); \
} else { \
class_replaceMethod((class), \
(swizzledSelector), \
method_getImplementation(originalMethod), \
method_getTypeEncoding(originalMethod)); \
} \
}
ps:第一行變灰了不是注釋掉了,不知道m(xù)arkdown哪里出問(wèn)題了