1,自動(dòng)布局是一種基于約束的布局(constraint-based layout)引擎,它可以根據(jù)開發(fā)者在對(duì)象上的約束自動(dòng)調(diào)整大小與位置。
2.在iOS 6之前使用的布局模型是“sPRing&struts”模型。雖然大部分情況下運(yùn)行很有效率,但旋轉(zhuǎn)時(shí)仍然需要寫代碼為子視圖自定義布局。
3.布局代碼在layouSubviews方法中編寫。
4.在Xcode 5中使用自動(dòng)布局時(shí)第一個(gè)引人注目的變化是Xcode 5不會(huì)自動(dòng)添加約束,除非你明確的要求Xcode添加。
Xcode 5讓開發(fā)者控制布局,不會(huì)自動(dòng)添加約束。
如果添加的約束不夠定義布局,Xcode 5的故事板或者Interface Builder的編譯器會(huì)生成警告,還會(huì)給出修復(fù)建議。
在Xcode 5中,如果沒有添加任何約束,IDE會(huì)自動(dòng)在運(yùn)行時(shí)添加固定的位置和大小約束。
5.在Xcode 5中使用自動(dòng)布局
打開故事板,可以看到如下四個(gè)按鈕:
Align(第一個(gè)):用來添加對(duì)齊約束。
Pin():添加標(biāo)準(zhǔn)約束,比如相對(duì)于其他視圖的大小和位置。
Reslove(解決) Auto Layout Issues(情況):可以讓Xcode 自動(dòng)生成約束,或者基于約束把子視圖的邊框更新到正確的位置。
Resizing Behavior:可以用來設(shè)置哪些類會(huì)繼承這些約束。默認(rèn)情況下,Siblings and Ancestors(兄弟姐妹和祖先)和Descendants(后代)都是選中狀態(tài)。但是推薦把Silbings和Ancestors留空。如果選中的話,對(duì)齊視圖中的子視圖會(huì)變得很困難,子視圖的原點(diǎn)固定,當(dāng)你設(shè)置子視圖的大小時(shí),祖先視圖會(huì)跟著變,這樣很煩人。在創(chuàng)建布局時(shí),會(huì)用到其他三個(gè)菜單按鈕。
6.固有尺寸
iOS中大部分控件元素都有固有尺寸。打開尺寸查看面板(size inspector),會(huì)發(fā)現(xiàn)有些屬性(eg:高度和寬度)無(wú)法修改。
7.固有尺寸和本地化
UILabel和UIButton的固有尺寸很有意思。固有尺寸反應(yīng)了其內(nèi)容,標(biāo)題越長(zhǎng),標(biāo)簽的固有尺寸越寬,這種特性搭配自動(dòng)布局能夠容易創(chuàng)建可以根據(jù)不同語(yǔ)言的內(nèi)突自動(dòng)調(diào)整尺寸的按鈕和標(biāo)簽。
8.設(shè)計(jì)時(shí)和運(yùn)行時(shí)布局
Xcode 5不會(huì)自動(dòng)添加約束。相反,如果添加的約束不能無(wú)歧義的描述布局,Xcode 5會(huì)顯示一系列的警告或者錯(cuò)誤,而且會(huì)高亮布局中的歧義。
大部分情況下,任何會(huì)導(dǎo)致用戶界面錯(cuò)誤布局的情況都會(huì)產(chǎn)生警告,并且運(yùn)行時(shí)崩潰(主要由帶歧義的約束造成)會(huì)被視為錯(cuò)誤。設(shè)計(jì)時(shí)(即設(shè)計(jì)階段,相對(duì)運(yùn)行時(shí)而言)有問題的控件會(huì)用黃色實(shí)線框框起來,運(yùn)行時(shí)有問題的控件則用紅色虛線框框起來。
黃色框突出了有問題的控件,顯示其在設(shè)計(jì)時(shí)的大小和位置,紅色框則顯示了其在運(yùn)行時(shí)的大小和位置。
不要手動(dòng)添加缺失的約束,點(diǎn)擊第三個(gè)菜單按鈕,選擇“Add Missing Constraints”來讓Xcode 自動(dòng)添加。
9.自動(dòng)更新邊框
當(dāng)某個(gè)視圖位置不對(duì)時(shí)會(huì)出現(xiàn)如下所示的警告:
可以點(diǎn)擊第三個(gè)按鈕并選擇Update Frames來消除這種警告。
10.頂部和底部布局引導(dǎo)
在iOS 7中,每個(gè)視圖控制器都有兩個(gè)屬性,叫做topLayoutGuide和bottomLayoutGuide。Xcode 5將其顯示為IB文檔中的對(duì)象。我們可以把視圖相對(duì)于這兩個(gè)屬性對(duì)齊。
11.輔助編輯器中的布局預(yù)覽
Xcode 5的輔助編輯器也能預(yù)覽用戶界面,可以模擬iOS 6和iOS 7設(shè)備,以及橫屏及豎屏。只要打開輔助編輯器,點(diǎn)擊頂層路徑式導(dǎo)航欄菜單的第一個(gè)按鈕,選擇Preview,就能在輔助編輯器面板中看到用戶界面預(yù)覽。預(yù)覽面板會(huì)隨著文檔的修改而實(shí)時(shí)更新。
12.在設(shè)計(jì)時(shí)調(diào)試自動(dòng)布局
Xcode 5調(diào)試自動(dòng)布局比以前容易的多,以前只能在各種設(shè)備上運(yùn)行應(yīng)用然后等著崩潰。Xcode 5允許開發(fā)者在設(shè)計(jì)時(shí)可視化的處理這些崩潰。光這一點(diǎn)就是工作流上的巨大改進(jìn)了。
自動(dòng)布局有兩類主要問題,第一類發(fā)生在約束集不足以定義所有可能的屏幕方向/尺寸下的布局時(shí)。第二類則是太多約束導(dǎo)致至少在一種屏幕方向下會(huì)產(chǎn)生沖突時(shí)發(fā)生的。
第一類問題大體上可以分為兩種,邊框歧義和視圖擺放錯(cuò)誤。當(dāng)你沒有添加約束來無(wú)歧義的確定視圖在運(yùn)行時(shí)的位置和大小時(shí)就會(huì)產(chǎn)生邊框歧義。視圖擺放錯(cuò)誤則是邊框歧義的副作用。設(shè)計(jì)時(shí)視圖的大小和位置可能和運(yùn)行時(shí)的大小和位置不匹配,這是Xcode 會(huì)警告視圖擺放錯(cuò)誤。通常添加必要的約束就能解決這個(gè)問題。
顧名思義,約束沖突發(fā)生在添加的約束互相之間會(huì)產(chǎn)生沖突時(shí),這個(gè)時(shí)候,自動(dòng)布局引擎會(huì)試圖在運(yùn)行時(shí)破壞約束(并且會(huì)打印一條消息列出被破壞的約束)并布局,如果失敗就會(huì)產(chǎn)生運(yùn)行時(shí)崩潰。約束沖突是僅有的無(wú)法在設(shè)計(jì)時(shí)發(fā)現(xiàn)的布局錯(cuò)誤。在部分情況下,約束都是在某種屏幕方向下沖突的,可能你添加的約束在豎屏的情況下工作良好,到了橫屏情況下卻互相沖突了。
13.在自動(dòng)布局中使用滾動(dòng)視圖
14.使用自動(dòng)布局和邊框
15.可視格式化語(yǔ)言及其缺點(diǎn)
16.調(diào)試布局錯(cuò)誤
調(diào)試臺(tái)日志會(huì)列出自動(dòng)布局的約束。
我的CSDN博客地址:http://blog.csdn.net/qw963895582/article
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注