先上github ??WELCustomStatusbarColor
大概就是這樣
我必須先說一句,iOS的statusbar的顏色默認只有黑和白,我相信這樣的設計自然有其原因辨液。而非黑&白的配色設計也同樣有其原因靠瞎,對吧?
接著說寫這個項目的動機唉工。起初研乒,只是想獲取statusbar的TouchUP事件。在所有已知的常規(guī)方法的都能解決的情況下淋硝,我決定去私有層看看雹熬。當然宽菜,這個簡單的需求自然是很快便解決了。而已然進入了私有層竿报,作這么個小東西還不是很過癮铅乡,必須要干點什么事出來。于是就有了這個項目烈菌。
只需要閱讀其頭文件阵幸,再加上下幾的斷點,就找到了對應的方案芽世。
大概流程就是:bar上的東西最后都會作為UIImag傳給bar(具體的實現(xiàn)比這個復雜一些)挚赊,鉤這個方法,把圖片渲染成相應的顏色济瓢。而需要改顏色的時候荠割,調(diào)用setNeedsStatusBarAppearanceUpdate就可以了。
真實開發(fā)中應該不會遇見這種需求旺矾,不過做這個項目的邏輯卻是經(jīng)常會用到的涨共,尤其是遇見一些惡心的需求,可以幫我們省下大量的時間宠漩。我會在接下來的幾篇文中為大家介紹我在項目中是怎么用runtime解決問題的举反。希望可以為諸位帶來幫助。
## Update?
再更新幾個關于statusbar的知識扒吁,算是需求經(jīng)常會遇見的火鼻。
1 view怎么遮擋statusbar
當你彈出一個全屏的半透明黑色蒙版并且statusbar是白色的時候,這個問題就是你需要考慮的了雕崩。
不注意的話魁索,可能就會做成這樣
2 怎么更改statusbar的背景色
當你的scrollView滑動的同時會隱藏navBar的時候盼铁,這個問題你可能會遇到粗蔚。
幾年前蠢的很,在上面放了20pt高的view饶火。不過顯然有簡單的辦法鹏控。
3 怎么自由改statusbar的Frame
這個就不放圖了,腦補scrollView和statusbar一起比翼齊飛的效果肤寝。
先想了這么幾個問題当辐,下面一一解答。
首先鲤看,statusbar到底是個什么東西呢缘揪?
打開開發(fā)利器 iOS-Runtime-Headers 閱讀UIApplication的頭文件,可以發(fā)現(xiàn)UIApplication有一個名為statusBar的屬性。
獲取之找筝, po之蹈垢,可以發(fā)現(xiàn)如下信息:
也就是說,其實statusBar就是個view袖裕。
繼續(xù)po曹抬,可以發(fā)現(xiàn)如下信息:
到這里,事實已經(jīng)很明顯了陆赋。
有一個類型為UIStatusBarWindow的window被UIApplication的單例強引用沐祷,在這個window上面add了statusbar這個View。
如果調(diào)用下面這句代碼
[[UIApplication sharedApplication] setValue:nil forKey:@"_statusBarWindow"];
會發(fā)現(xiàn)app的statusbar沒有了攒岛,原因很簡單赖临,一個window的引用計數(shù)器為0的時候,便會被系統(tǒng)干掉灾锯。
有了這些認識兢榨,我們可以回答上面的問題了。
先說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也可以做澎羞。
比如 改背景顏色這樣就可以實現(xiàn)。改frame同理敛苇。
UIView *statusbar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
statusbar.backgroundColor= [UIColor redColor];
如果大家還有什么關于statusbar的問題,可以在評論里留言,我會一一解答枫攀。
感謝閱讀括饶!