iOS7之后兩者合為一體,共用同一個(gè)背景色,導(dǎo)航欄緊跟著狀態(tài)欄布局,也就是導(dǎo)航欄從y=20開始布局.今天遇到奇怪的問題,就是導(dǎo)航欄直接從屏幕頂端開始布局,也就是導(dǎo)航欄和狀態(tài)欄重合在一起了.
看圖:
造成這樣問題的情景是,我有一個(gè)父ViewController,假設(shè)為A,里面有一個(gè)子ViewController,假設(shè)為B. B本身自帶一個(gè)導(dǎo)航控制器.
我有一個(gè)操作,類似手機(jī)QQ主界面導(dǎo)航欄左邊按鈕的功能,就是縮小B,從左邊推出菜單欄,然后點(diǎn)擊菜單欄,push到一個(gè)新的頁面然后返回,回來之后,并且回來的時(shí)候把B的導(dǎo)航欄重新添加了一次,B的導(dǎo)航欄就變成上圖那樣了.
因?yàn)檫@個(gè)時(shí)候B是縮小的,它本身接觸不到狀態(tài)欄,我猜測(cè)系統(tǒng)會(huì)認(rèn)為對(duì)B來說狀態(tài)欄是隱藏的,所以就把B的導(dǎo)航欄上移,直接從主view的頂部開始布局.注意,這里是通過隱藏導(dǎo)航欄又添加把導(dǎo)航欄刷新了一下.否則會(huì)保持原樣.
最后,修改措施是保證B不會(huì)再被縮小的情況下刷新navigationBar,也可能是在和statusBar沒有接觸的情況下.具體的文檔或者官方解釋沒有找到,不知道有人知道確切的原理,上面都只是觀察而已.
這個(gè)問題深究一下是設(shè)計(jì)上的尷尬.UIViewController定位為UIView的控制器,UIView是任意大小的東西,從這個(gè)角度來說UIViewController是不受大小的約束,或說和大小這個(gè)因素是不能夠依賴的.但是像statusBar的樣式 是否顯示,還有橫豎屏的旋轉(zhuǎn)卻又依賴于UIViewController的方法.
如果一個(gè)界面里有多個(gè)UIViewController,從人的心理解讀觸發(fā),我們會(huì)認(rèn)為鋪滿這個(gè)屏幕的這個(gè)界面是主UIViewController,但實(shí)際UIViewController不是根據(jù)大小或者說根據(jù)屏幕的關(guān)系來處理主次的.或許應(yīng)該有個(gè)標(biāo)識(shí)來制定誰(哪個(gè)UIViewController)來負(fù)責(zé)當(dāng)前的狀態(tài)欄\橫豎屏\導(dǎo)航欄之類的全局性質(zhì)的東西的處理.或者狀態(tài)欄這種和整個(gè)app是同一個(gè)層面的東西,不應(yīng)該是viewController來控制,而是任何地方都可以控制,比如做成UIApplication的一個(gè)屬性,我想讓它顯示就顯示,怎么顯示就怎么顯示.
或者,就應(yīng)該存在類似于游戲里場(chǎng)景(scene)的概念,就是我們平常理解的一個(gè)界面.應(yīng)該有這么一個(gè)類,它就是我們當(dāng)前看到的一切,然后它里面有很多的viewController.由他來控制我們看到的唯一的那些東西.比如橫豎屏,因?yàn)関iewController有多個(gè),而橫屏還是豎屏只會(huì)有一個(gè),在級(jí)別上它們是不對(duì)稱的.