天天看點

iOS8新特性 : Size Classes



iOS8新特性:Size Classes,是對老式UI思路的全新抽象:把各個裝置螢幕(iphone4,5,6, ipad,iwatch?)以及它們的螢幕旋轉狀态都抽象成螢幕Size的變化,将這些Size歸納成幾個類别(Class)

iOS8新特性 : Size Classes

寬(正常,任意, 緊湊),高(正常,任意, 緊湊)

3x3共9種Size,每種Size都可以設定特定的一套布局,如果不特殊指定,預設是在(寬任意,高任意)模式下設定,且其他8種布局繼承它。

聽過有人說,我們不用學autolayout了,直接學Size Class就一步到位了。這個說法是不對的,因為Size Class在将螢幕分類後,執行布局的還是Autolayout。

Size Classes與Interface Builder

當然不出所料的是,Xcode6中Interface Builder對Size Class有了很強大的支援:

iOS8新特性 : Size Classes

啟用Size Class後,IB中就會出現Size Class切換的菜單

我們可以切換到wAny,hAny模式去編輯通用的控件和布局,也可以切換到某個特定Class,立刻可以預覽到變化,于是有個問題:

假如iPad和iPhone的布局有差異,老式寫法是分成ipad.storyboard和iphone.storyboard來分别寫,這本身就是個bug,因為大部分控件其實并沒差别,新Size Class解決這個問題了木?

答案是肯定的,Size Class的方案比老式的好了幾條街:

IB中某個View的出現與否,限制的出現與否以及限制的值都是可以根據Size Class單獨設定的,也就是說現在一個storyboard是9合1的。

比如下面有個Label,我隻希望它出現在長寬緊縮的螢幕上時(例如iwatch),這麼勾選下就可以(出現或不出現被命名為”Installed”,這個選項可以從9個Size Class中多選)

需要注意的是:預設隻會顯示一個Installed,我們需要在選種某一控件的條件下,點選這個選項前部的+号,來選擇該控件在不同Size Class模式下的顯示情況,選中表示在該模式下顯示該控件,取消勾選表示在該模式下不顯示。若直接勾掉第一個Installed選項,則該控件被删除,不會出現在任何一種Size Class 模式下。

iOS8新特性 : Size Classes

Size Classes的xml檔案改動

說到9合1的時候肯定會有疑問,這樣的storyboard檔案會不會很大?源檔案會不會很亂導緻多人開發經常沖突?

答案是不會的,源于apple對Size Class在xml中的描述方法是針對變化配置的,什麼意思呢?對比下storyboard的xml源檔案就知道了:

wAny,hAny模式下剛才隻有一個Label的頁面:

iOS8新特性 : Size Classes

假如在wC,hC緊縮模式下設定不出現這個label時,在label的父view層級出現了下面的配置:

iOS8新特性 : Size Classes

是以說ib中以附加的描述字段來表示哪些元素是被哪些Size Class包含或排除的,也正因為這樣的描述方式,使得新的xml格式可以被低版本相容(低版本不解析這個字段,但其他字段正常解析)

Size Classes與xcassets

既然storyboard變成了9合1,配套的xcassets必須也有所表示才行,xcode6後向xcassets中添加圖檔時增加了選擇對應Size Classes的菜單,展開後會像下面一樣:

iOS8新特性 : Size Classes

通過符号表示确實不錯 -對應緊縮,*對應Any,+對應寬松

(@3x是iphone6 plus)

總結

總的來說,iOS對UI這塊的改動是跨時代性的,Autolayout的出現使得布局的複雜度減少到了View與View的關系上,再由根 View(也就是螢幕)指定frame,随後所有子View相對布局,把frame的概念歸一化到根View的frame上;但有了Size Class後,根視圖的frame概念也被移除了,這下整個app的UI和frame這個單詞已然脫離關系,這也正是apple想要達到的目的。