xcode6中自動佈局autolayout和sizeclass的使用

轉自:http://blog.csdn.net/lihuiqwertyuiop/article/details/39271887

一、關於自動佈局(Autolayout)

hi,all:

在經過了一番猶豫之後,我決定將我自己做的這個小APP的源碼公佈給大家:

其出發點是和大家一起學習iOS開發,僅供學習參考之用。之前代碼是託管與gitlab

上的,今天我將其pull到github上來了,大家可以自行下載:git clone [email protected]:lihux/twentyThousandTomatoes.git沒有安裝git或者不會用的童鞋,

請猛戳github地址:https://github.com/lihux/twentyThousandTomatoes,進去之後選

擇download zip下載即可。


Xcode中,自動佈局看似是一個很複雜的系統,在真正使用它之前,我也是這麼認爲的,不過事實並非如此。

我們知道,一款iOS應用,其主要UI組件是由一個個相對獨立的可視單元構成,這些可視單元有的主要負責向用戶

輸出有用的信息,有些則負責信息的輸入(交互),交互的過程中往往還伴隨有動畫的效果,已達到整個信息傳遞的連

貫性以及用戶體驗的細膩感。可視單元,在實際開發中主要是viewbutton等,那麼這些可視單元的關係由兩個基本的

關係構成:兄弟關係和父子關係,整個視圖單元就是一個樹形結構:



對於任何一個UI組件,確定了它的(相對於父view)位置、大小也就確定了它在整個UI視圖中的展示效果


Autolayout(以及iOS8中新增的sizeclass)是爲了解決這些UI可視單元或者元素是怎樣佈局、排列的問題。在過去

只有iPhone4的時候,我們可以在代碼裏將沒一個可視單元的位置寫死,這樣是沒問題的,但隨着iPhone56的發佈,

屏幕尺寸有了越來越多中可能,未來不排除更多尺寸的iPhone發佈出來,這就要求我們的APPUI元素具有在屏幕尺寸

不同的設備上具有一定動態的可調性,已實現較好的UI展示效果。從目前蘋果提供的技術來看,有下、中、上三種實現

方法:


下策是,代碼中判斷當前設備的尺寸,對UI元素進行手工的調整,其缺點是顯而易見的:代碼複雜、容易出錯、且

維護難度大、靈活性極差;


中策是,通過設置可視單元(UIView UIButton...)的autoresizing屬性,預設當該view所在的環境(父view)發生變化時它的尺寸和位置應該如何調整,該方法可以在Xcodeinterface builder中(storyboard或者 xib)設置完成,但其只能針對父子關係進行有限的調整,比如左邊距是否固定,尺寸是否可變等,而對於兄弟關係的調整則無法實現,對於UI比較固定的APP這種調節方式也算基本滿足需求;

上策就是結合使用autolayoutsizeclassUI可視單元的父子關係、兄弟關係進行全方位的調整,而且調節精度更高:不僅能確定一個view的位置尺寸的變化依據是什麼,還能對這些依據加以不同的優先級,先滿足什麼條件,再滿足什麼條件,對於重要的位置尺寸可以優先保證,這樣整個APP就具有極強的動態可調性,滿足不同設備、不同應用場景下的需求。


在目前蘋果手機蘋果尺寸多達四種的情況下,顯然新的APP必須要採用上策來解決視圖組件的佈局問題。


Autolayout的作用非常明確:幫我們確定在不同設備、不同(父view)環境下,同一個可視單元所應具有合適的位置和尺寸,因此,當一個UIView上所施加的約束能夠唯一確定它的framex, y, width, height)的時候我們的自動佈局的使用纔是正確的。而新手通常犯的兩類錯誤就是約束不足(約束太少)和約束衝突兩種(約束太多)。如果你給出的約束只能夠確定這個view的大小,或者位置或者位置中的某一個項(比如x)的時候,就會出現約束不足的情況,在xibstoryboard中,會以黃色的警告出現在左側提示框內;如果你給出的約束推導出了兩個甚至多個互相矛盾的位置尺寸結果的時候,就產生了佈局錯誤,在編譯的時候直接就build不過。

二、關於iOS8新增的sizeclass屬性


iOS8中,新增了Size Classes特性,它是對當前所有iOS設備尺寸的一個抽象,也是該抽象了,想想現在多少種i

OS尺寸的設備吧:iPhone4-5-6-6plusiPadiPad miniiWatch,如何還是按照以前那針對種特定設備來編寫不同的

佈局的話,一定是很糟糕的一件事情。現在有了sizeclass,事情就好辦多了:你不是設備多嗎,那我們就只把屏幕的寬

和高分別分成三種情況:(Compact, Regular, Any),也即緊湊、正常和任意。這樣寬和高三三一整合,一共9中情況

。如下圖所示,針對每一種情況,如果需要的話,我們可以單獨在storyboardxib中設置UIView的自動佈局約束,甚至

某一個button是否顯示都是能輕鬆實現。



關於size class的詳細解析,參考蘋果文檔和wwdc2014:點擊打開鏈接 (What's New in Interface Builder)

     三、storyboardautolayoutsize class的無敵配合

                                           

Xcodeinterface builder比較熟悉的童鞋應該對UIButton的超強定製性映像深刻:通過選擇button的不同狀態normalheightdisabled...),我們可以單獨設置每一種狀態,buttonbackground imageimagetext color等屬

  性,見下圖:


Xcode6中對自動佈局的重大變更有異曲同工之妙:開發者可以根據實際需要,針對size class的九種組合中的某

一種或幾種分別進行自動佈局的設置,這樣,當APP運行於不同屏幕、不同旋轉方向的時候,就可以根據當前環境的

size class情況使用我們預先設置好的佈局信息,從而達到APP UI的極大靈活性。

和設置UIButton的不同狀態的不同屬性類似,我們首先選擇一種size class,然後針對該種size class進行自動佈局。下面我們以一個簡單的佈局場景爲例進行說明:

假設,我們想實現下面這個效果:橫屏和豎屏頭像和label都能正常的現實,且在比較恰當的位置:顯然橫屏的時

候,高度處於壓縮的狀態,(height: compact),我們需要先對正常的佈局之外,還要添加一種(wAny, hCompact

size class的佈局:

首先,我們對默認的sizeclass進行佈局,確定頭像和label的位置和尺寸:




設置完(wAny hAny)之後,點擊wAny hAny文字(上圖底部),選擇(wAny hCompact):注意點擊後彈出一

個九宮格浮框,拖動鼠標即可選擇響應的size class,注意在右下角(紅色方框表示),還可以選擇是否install,如果取

消勾選,則這個頭像在當前size class下就不會被加載(自然也就不顯示出來)。




在新的size class下我們開始添加新的佈局,注意,這裏並沒有覆蓋上一種size class我們定義好了得佈局,知識針對當前的size class添加新的、獨立的佈局信息,狡兔三窟,Xcode6這下子一口氣給了我們九個窟窿,爽!大笑



佈局完畢,運行起來,即可達到我們想要的效果!

Awesome, isn't it ?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章