iOS設(shè)置statusBar顏色

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)題了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容