以后每用Runtime解決一個(gè)問(wèn)題,就會(huì)記錄在這個(gè)文集里频敛。
我將以真實(shí)的使用場(chǎng)景為大家講述Runtime的各種用法霸褒,讓Runtime真正的投入到生產(chǎn)中。
合輯demo Github地址
問(wèn)題描述
見(jiàn)過(guò)幾種滑動(dòng)隱藏UINavigationBar的方案芒粹,不管是KVO還是Runtime兄纺,最終的落點(diǎn)都是去改bar這個(gè)View。這個(gè)看起來(lái)簡(jiǎn)單的需求化漆,真正做過(guò)的估計(jì)都知道估脆,實(shí)際上還是有些坑的。
具體情況就是錯(cuò)位座云,莫名其妙的錯(cuò)位疙赠,總是在不經(jīng)意間錯(cuò)位付材。由于具體的實(shí)現(xiàn)不同,錯(cuò)位的元素也不一樣圃阳,有的是scrollView錯(cuò)位厌衔,有的是statusBar錯(cuò)位,琳瑯滿(mǎn)目捍岳,各有千秋富寿。效果如下
原因無(wú)外乎就是NavigationBar的frame被系統(tǒng)強(qiáng)制恢復(fù)到了初始位置,而相關(guān)元素沒(méi)有正確響應(yīng)這個(gè)事件祟同。
我粗略的算了下作喘,大概有這么幾種情況會(huì)觸發(fā)錯(cuò)位:NavigationBar初始化、modal&pop&push晕城、app進(jìn)入前臺(tái)泞坦、開(kāi)啟熱點(diǎn)或接到電話(huà)等。
也就是說(shuō)解決這個(gè)錯(cuò)位問(wèn)題的思路有兩種砖顷,第一種贰锁,在上訴場(chǎng)景做相應(yīng)的處理(比如手動(dòng)把NavigationBar歸位,貼吧的方案)。第二種滤蝠,找到NavigationBar歸位的原因豌熄,在這個(gè)地方直接處理。
本文要介紹第二種物咳。
解決思路
通過(guò)給NavigationBar的setCenter:下斷點(diǎn)锣险,可以找到這么一個(gè)方法
-[UINavigationController _updateBarsForCurrentInterfaceOrientation]
這個(gè)方法會(huì)在所有NavigationBar可能需要更新的地方被調(diào)用。
知道了這個(gè)方法览闰,問(wèn)題就簡(jiǎn)化了很多芯肤,直接鉤這個(gè)方法,根據(jù)上下文來(lái)做相應(yīng)的處理压鉴。具體的處理代碼崖咨,一般和頁(yè)面布局以及實(shí)現(xiàn)有關(guān),這里就不上代碼了油吭。
end
這種方式的優(yōu)點(diǎn)是可以把判斷邏輯集中击蹲,更加可靠,不會(huì)漏掉某種情況婉宰。缺點(diǎn)也有歌豺,這是個(gè)私有API,有的人不敢用心包。