iOS 8 Size Classes 初探
iOS8新特性,Size Classes,是對老式UI思路的全新抽象:把各個設(shè)備屏幕(iphone4,5,6, ipad,iwatch?)以及它們的屏幕旋轉(zhuǎn)狀態(tài)都抽象成屏幕Size的變化,將這些Size歸納成幾個類別(Class)
寬(正常,任意, 緊湊),高(正常,任意, 緊湊)
3x3共9種Size,每種Size都可以設(shè)置特定的一套布局,如果不特殊指定,默認(rèn)是在(寬任意,高任意)模式下設(shè)置,且其他8種布局繼承它。
聽過有人說,我們不用學(xué)autolayout了,直接學(xué)Size Class就一步到位了。這個說法是不對的,因為Size Class在將屏幕分類后,執(zhí)行布局的還是Autolayout。
Size Classes與Interface Builder
當(dāng)然不出所料的是,Xcode6中Interface Builder對Size Class有了很強大的支持:
啟用Size Class后,IB中就會出現(xiàn)Size Class切換的菜單
我們可以切換到wAny,hAny模式去編輯通用的控件和布局,也可以切換到某個特定Class,立刻可以預(yù)覽到變化,于是有個問題:
假如iPad和iPhone的布局有差異,老式寫法是分成ipad.storyboard和iphone.storyboard來分別寫,這本身就是個bug,因為大部分控件其實并沒差別,新Size Class解決這個問題了木?
答案是肯定的,Size Class的方案比老式的好了幾條街:
IB中某個View的出現(xiàn)與否,約束的出現(xiàn)與否以及約束的值都是可以根據(jù)Size Class單獨設(shè)置的,也就是說現(xiàn)在一個storyboard是9合1的。
比如下面有個Label,我只希望它出現(xiàn)在長寬緊縮的屏幕上時(腦補iwatch),這么勾選下就可以(出現(xiàn)或不出現(xiàn)被命名為”Installed”,這個選項可以從9個Size Class中多選)
Size Classes的xml文件改動
說到9合1的時候肯定會有疑問,這樣的storyboard文件會不會很大?源文件會不會很亂導(dǎo)致多人開發(fā)經(jīng)常沖突?
答案是不會的,源于apple對Size Class在xml中的描述方法是針對變化配置的,什么意思呢?對比下storyboard的xml源文件就知道了:
wAny,hAny模式下剛才只有一個Label的頁面:
假如在wC,hC緊縮模式下設(shè)置不出現(xiàn)這個label時,在label的父view層級出現(xiàn)了下面的配置:
所以說ib中以附加的描述字段來表示哪些元素是被哪些Size Class包含或排除的,也正因為這樣的描述方式,使得新的xml格式可以被低版本兼容(低版本不解析這個字段,但其他字段正常解析)
Size Classes與xcassets
既然storyboard變成了9合1,配套的xcassets必須也有所表示才行,xcode6后向xcassets中添加圖片時增加了選擇對應(yīng)Size Classes的菜單,展開后會像下面一樣:
通過符號表示確實不錯 -對應(yīng)緊縮,*對應(yīng)Any,+對應(yīng)寬松
(@3x是iphone6 plus)
總結(jié)
總的來說,iOS對UI這塊的改動是跨時代性的,Autolayout的出現(xiàn)使得布局的復(fù)雜度減少到了View與View的關(guān)系上,再由根 View(也就是屏幕)指定frame,隨后所有子View相對布局,把frame的概念歸一化到根View的frame上;但有了Size Class后,根視圖的frame概念也被移除了,這下整個app的UI和frame這個單詞已然脫離關(guān)系,這也正是apple想要達(dá)到的目的。
Farewell,frame和那些還奮戰(zhàn)在手寫UI的iOS coder們…