全網首發 iOS自定義statusbar上icon的顏色

先上github ??WELCustomStatusbarColor

大概就是這樣


我必須先說一句,iOS的statusbar的顏色默認只有黑和白,我相信這樣的設計自然有其原因。而非黑&白的配色設計也同樣有其原因,對吧?

接著說寫這個項目的動機。起初,只是想獲取statusbar的TouchUP事件。在所有已知的常規方法的都能解決的情況下,我決定去私有層看看。當然,這個簡單的需求自然是很快便解決了。而已然進入了私有層,作這么個小東西還不是很過癮,必須要干點什么事出來。于是就有了這個項目。

只需要閱讀其頭文件,再加上下幾的斷點,就找到了對應的方案。

大概流程就是:bar上的東西最后都會作為UIImag傳給bar(具體的實現比這個復雜一些),鉤這個方法,把圖片渲染成相應的顏色。而需要改顏色的時候,調用setNeedsStatusBarAppearanceUpdate就可以了。

真實開發中應該不會遇見這種需求,不過做這個項目的邏輯卻是經常會用到的,尤其是遇見一些惡心的需求,可以幫我們省下大量的時間。我會在接下來的幾篇文中為大家介紹我在項目中是怎么用runtime解決問題的。希望可以為諸位帶來幫助。

## Update?

再更新幾個關于statusbar的知識,算是需求經常會遇見的。

1 view怎么遮擋statusbar

當你彈出一個全屏的半透明黑色蒙版并且statusbar是白色的時候,這個問題就是你需要考慮的了。

不注意的話,可能就會做成這樣


在我司,半透明蒙版擋不住bar絕逼是不能上架的....


2 怎么更改statusbar的背景色

當你的scrollView滑動的同時會隱藏navBar的時候,這個問題你可能會遇到。

幾年前蠢的很,在上面放了20pt高的view。不過顯然有簡單的辦法。

大概是這么個需求

3 怎么自由改statusbar的Frame

這個就不放圖了,腦補scrollView和statusbar一起比翼齊飛的效果。


先想了這么幾個問題,下面一一解答。

首先,statusbar到底是個什么東西呢?

打開開發利器 iOS-Runtime-Headers 閱讀UIApplication的頭文件,可以發現UIApplication有一個名為statusBar的屬性。

獲取之, po之,可以發現如下信息:


也就是說,其實statusBar就是個view。

繼續po,可以發現如下信息:


到這里,事實已經很明顯了。

有一個類型為UIStatusBarWindow的window被UIApplication的單例強引用,在這個window上面add了statusbar這個View。

如果調用下面這句代碼

[[UIApplication sharedApplication] setValue:nil forKey:@"_statusBarWindow"];

會發現app的statusbar沒有了,原因很簡單,一個window的引用計數器為0的時候,便會被系統干掉。

有了這些認識,我們可以回答上面的問題了。

先說window,UIStatusBarWindow的windowLevel是1000,等于UIWindowLevelStatusBar。

(UIWindowLevelNormal == 0; UIWindowLevelAlert == 2000)

要想遮擋statusbar,只需要把顯示用的view加到windowLevel > 1000的window上顯示。

當然,不光是視覺上遮擋,statusbar的手勢也會被遮擋。這個特性有時候可能會很有用,比如我這正在做的一個項目,有個頁面是彈出一個卡片,卡片距離屏幕頂部只有50pt左右,需求希望可以通過點擊頂部消失卡片。如果這個卡片加在NormalLevel的window上,那么點擊頂部有一半幾率會點到statusbar上,效果就很不理想。這時候放在AlertLevel的window上就很合適。

既然statusbar是個View,那理論上view可以做的,statusbar也可以做。

比如 改背景顏色這樣就可以實現。改frame同理。

UIView *statusbar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];

statusbar.backgroundColor= [UIColor redColor];


如果大家還有什么關于statusbar的問題,可以在評論里留言,我會一一解答。

感謝閱讀!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,301評論 25 708
  • 《我的散文集》目錄 今天是2017年8月9號,很久很久沒有你的任何消息了。 我有時會幻想在某...
    瀟湘月明閱讀 362評論 10 8
  • 窗外的雨嘀嗒滴滴 思緒回到過去 記憶的光影 慢慢靠近 你問 大海是否也有遠方 我出神的望 心不知飛向哪里 當...
    言一JAYI閱讀 155評論 0 0
  • 馬上二十三,沒有談過一次戀愛,有暗戀過,表白過,不過現在我們是朋友,可能彼此都覺得朋友會更好,他迄今為止算是我...
    多肉變瘦了閱讀 164評論 0 1
  • 文/夏木兮 1. 前幾天和朋友聊天。 朋友說:“你知道嗎?有天打開微信,在列表里找爸爸的微信號時,發過去的信息,上...
    夏木兮閱讀 1,588評論 4 6