IOS7的一個小改變

征途LN發表於2013-12-14

這段時間一直忙著專案中功能點的實現,對介面上的東西沒有過多的注意,昨天我把美工剛給我設計好的介面拿過來,打算調整一下程式的介面,我發現了一個問題…… 

好了,不羅嗦了,進入主題

因為我這個介面主要是用來展示圖書列表的,因此上滿加了一個scrollView,這樣可以展示多於一屏的介面,當我按照美工設計的尺寸往scrollView上加圖的以後,每次執行發現圖片在scrollView上的顯示都有向下一段畫素的偏移,我仔細的檢查了一遍又一遍的程式碼,也沒有發現問題。我剛開始想的是圖片的偏移是不是因為那裡更改了scrollView的contentOffset屬性被修改了,我查詢了程式碼中這個屬性,結果沒發現。經過斷點除錯,我從堆疊裡的資訊裡發現從程式執行開始到執行到斷點之前,系統已經執行了很多功能,從裡面我發現NavigationController,做了很多事情,再看介面,這個介面上面確實有NavigationBar的存在,我目測一下,下移的高度和NavigationBar+statuBar的高度,我從建立到最後執行這段程式碼這兩處分別都列印了scrollView.contentOffset.y的值,結果發現沒變!這更讓我無法接受了!!明明是下移了,但是為什麼列印出來沒有改變呢?

我用了剛學的一個監測系統內部變數狀態變化的方法:就是在建立scrollView的同時新建立一個執行緒,來不斷的監聽scrollView.contentOffset.y的值從建立到最終加到螢幕上後這段時間內的變化,結果我發現列印的結果是0.0--64.0--0.0!這說明系統預設對scrollView.contentOffset.y做了64個畫素的偏移,這讓我不能理解了。這是為什麼呢?我又仔細查詢了scrollView的相信介紹,發現加在scrollView上的view的顯示同時受到以下三個屬性的限制:contentOffset,contentSize和contentInset這三者的限制,前兩個屬性我們都知道,也一直在用,這是這第三個屬性一直都沒用過甚至都不知道它的存在。

經過一番查詢我發現:從IOS7之後,桌面的座標原點相對以前發生了變化,在IOS7以前的系統,如果介面上加了statuBar後,座標原點會相對原來的(0,0)下移至(0,20),如果介面上再同時出現了NavigationBar之後座標原點就會下移到(0,64)的位置,這時候你列印self.view.frame的時候你會發現,他的frame會變成(0,0,320,416)。但是到了IOS7以後,就有了變化。這是因為新系統採用了完全不一樣的風格,系統的各種用於導航的空間都採用了半透明的設定,這樣使得使用者能夠透過這些控制元件看到它背後的東西,因此view的座標原點一直都沒有變化,但是它比較智慧,為了讓你少做工作,它把scrollView.contentInset做了一個便宜,如果介面上有statuBar存在它就將scrollView.contentInset.top設定為20,如果還有NavigationBar那就設定為64,這樣使得contentSize這個框向下移動了指定的畫素,移動好以後,又把contentOffset的屬性設定為(0,0),好像什麼也沒發生一樣。


總結一下:IOS7系統以後,view的定點一直都在左上角,不管介面是不是有狀態列和導航欄。還有就是如果有狀態列或者導航欄,你在使用scrollView的時候,它會很智慧的講內部試圖向下做個偏移。(我覺得他這種智慧是多餘的,還是讓我們自己做好了)

當然這只是我個人的拙見,如果牛人路過發現有什麼不對的地方,還請幫忙給指出來,謝謝了!

相關文章