在新項目中使用Xib有一段時間了,遇到了不少的問題,也收獲了很多的奇跡,最讓我驚嘆的就是使用熟練之后的界面開發(fā)速度,完勝Android那種XML方式的半吊子可視化界面開發(fā)工具。這里把使用心得匯總一下,希望能幫到大家。 一、Xib的使用深度StoryBoard不是我的菜,畢竟VC之間的邏輯關系和跳轉(zhuǎn)都比較復雜,甚至有時還得實現(xiàn)自己的棧管理,我更喜歡只是純頁面開發(fā)的時候使用可視化工具,就像Android的XML一樣。感謝蘋果,XCode的可視化工具比Android那個半吊子強太多了。 Xib中頁面元素與VC中的事件關聯(lián)我通常自己來通過addTarget的方式手動做,一方面是因為Android中這么做習慣了,另一方面事件注冊的可變性太大,VC下面有時候還會分成更小單元粒度的Controller,就像Android中的Fragment一樣。 二、Xib的基本原則1、怎么樣唯一確定一個View的布局?只要直接或者間接確定x,y,width,height這四個值就可以了。這就是Xib的中心思想。 確定x和y的方式有很多種,這里舉幾個常見的例子:指定View在Parent中橫向居中就是確定x的值,豎向居中則是確定y的值。指定相對于上方或下方View的距離就是確定View的y值,相對于左方或右方View的距離,就是確定View的x值。同時指定View距離其左方和右方View的距離,就可以同時確定x和width,而同時指定View距離其上方和下方的View的距離,就可以同時確定y和height。 2、支持定制對于Xib中的一個View,可以指定其Custome類,這樣就把具體實現(xiàn)交給繼承了UIView的那個類了。這樣,就可以對系統(tǒng)提供的任何View進行擴展,再通過Xib布局在頁面上。 3、代碼與Xib混排Xib中可以包含定制的View,而代碼生成的View中也可以添加通過Xib而Load進內(nèi)存的View。 4、Xib中View的確切布局時機在Xib中做頁面布局時,只是指定了一系列的Constraints,并由IB對這些Contraints進行預覽。那這些頁面中的View到底是在什么時間點布局呢?準確地說,是viewWillAppear之后和viewDidAppear之前。在這之前,Xib文件的根View默認是600*600的,并沒有根據(jù)Constraints在不同的Size Class下的表現(xiàn)進行l(wèi)ayout計算。也就是說,想得到布局完成的View樹并進行查看或操作,至少要到viewDidAppear中。 補充于2015.10.12 在一個使用AutoLayout布局的ALView中,使用代碼增加了一些計算好frame的subView,等效果出來后,subView的frame可能會被ALView改變,因此,有必要把ALView的AutoResizesSubViews設置為NO。 對于通過loadNamedXib加載到內(nèi)存中的View,必須手動指定其frame中的width和height,然后再通過addSubView的方式添加到現(xiàn)有的View樹中,使用Xib表示的View在布局時,是以600*600的默認寬高進行的。 5、根View寬高不確定我們在使用xib要時刻牢記。對于做過Android的同學來說,可以簡單地把xib的根View理解成一個RelativeLayout。xib的根View的寬高是在真正程序運行到布局時才會參考當前的Size Class確定下來。所以,除非特別必要,不要使用絕對值來確定x,y,width,height的值。 6、Size Class根據(jù)當前設備橫屏、豎屏,還是手機、Pad,Xib把它們歸為不同的Size Class,我們可以通過切換Size Class,讓View在不同Size Class下展現(xiàn)不同的特性。比如,手機橫屏和豎屏下,用戶頭像的位置分別位于屏幕上方和屏幕左方。 三、工具可以看看這篇文章“如何使用View Debugging”,通過這個調(diào)試工具可以看到View的層級關系、邊界等很詳細的信息。 四、動態(tài)位置調(diào)整這方面有一個很經(jīng)典的場景,就是在經(jīng)典的登錄界面中,頁面中主要的View從上往下依次是用戶名輸入框、密碼輸入框、校驗碼輸入框、登錄按鈕。默認情況是沒有校驗碼輸入框的,這個時候登錄按鈕要緊挨密碼輸入框,一旦用戶的登錄觸發(fā)安全策略,導致校驗碼輸入框彈出來之后,登錄按鈕就要下移,給校驗碼輸入框騰出位置來。 這在Android中可以使用Vertical的LinearLayout很輕松地布局出來,但在IOS中是沒有現(xiàn)成的View可以做到動態(tài)調(diào)整子View位置的。只能使用稍微笨一點兒的方式,在代碼中找到對應的Constraints,修改其Constant值。 這個時候需要注意,如果明確指定一個View的width和height等Constraints,那這個Constraints是屬于這個View的。決定View的x、y,或間接決定width、height的其它Constraints都是在View的superView中的。不要找錯了地方。 五、動態(tài)寬高有的時候,我們可能需要根據(jù)View中的內(nèi)容來動態(tài)調(diào)用一個View的寬高,如文章的Title,字數(shù)越多,Label越寬。這種情況就需要使用content hugging和content compression resistance這兩個屬性了。其詳細的解釋可以看看官方文檔。 六、多練這個是最高原則。我在新項目中除了少數(shù)幾個很特殊的控件自己實現(xiàn)之外,99%的布局都使用Xib來完成,一開始不太熟悉稍微有些慢,等熟悉了之后,開發(fā)速度非常快。如今屏幕尺寸這么多,這AutoLayout比手工通過代碼獲取屏幕寬高計算View布局的方式快了豈止一個數(shù)量級。多練習,會出現(xiàn)奇跡的。 |
|