來看看Auto Layout。
我們都知道的,Auto Layout可以描述視圖與其內(nèi)容相互之間的關(guān)系,也可以描述視圖視圖及其內(nèi)容與父視圖之間的關(guān)系。
那,Auto Layout 的工作原理是通過創(chuàng)建屏幕上的對象之間的關(guān)系來實現(xiàn)布局。
使用Auto Layout ,可以描述一些約束,用來指定視圖之間的關(guān)系;也可以設(shè)置一些視圖屬性,用來描述視圖與其內(nèi)容之間的關(guān)系。
1>內(nèi)容驅(qū)動的布局
Auto Layout是內(nèi)容驅(qū)動的。它在布局時會考慮視圖的內(nèi)容
2>優(yōu)先級規(guī)則
Auto Layout 通過優(yōu)先級規(guī)則權(quán)衡各布局選項的重要性,并對優(yōu)先級作適當調(diào)整,使之適合有挑戰(zhàn)性的邊界條件和特殊情況。當規(guī)則發(fā)生沖突時,系統(tǒng)根據(jù)優(yōu)先級排序選擇最重要的布局質(zhì)量來保護。
3>檢查和模塊化
Auto Layout可以有效地進行集中處理和檢查。只有當使用代碼創(chuàng)建布局時才能利用這一優(yōu)勢。
使用代碼創(chuàng)建布局,可以將規(guī)則劃分為一些通用方法(如loadView和updateViewConstraints)并自由地對這些方法進行注釋。
將約束進行模塊化是一件很簡單的事,當創(chuàng)建了將一個視圖相對于其父視圖居中的例程后,就可以無限地重用該例程。
視圖丟失?
1、欠約束導致丟失視圖
欠約束的視圖沒有為Auto Layout提供構(gòu)建視圖所需的足夠信息,因此它通常默認大小為0.
2、規(guī)則不一致導致丟失視圖
兩個視圖相互之間的約束規(guī)則不一致時,這種規(guī)則既可以實現(xiàn),也無歧義,這是因為視圖的寬度為0時,可滿足。所以丟失。
追蹤丟失的視圖:
在預期他們出現(xiàn)之后檢查他們的幾何形狀(例如使用viewDidAppear:和awakeFromNib),可以添加NSAssert語句來描述他們的預期大小和位置。
有歧義的布局
在開發(fā)過程中,可以調(diào)用hasAmbiguousLayout來測試視圖的約束是否充分。如果某個視圖可能顯示另一種不同的框架,則返回YES;如果某個視圖的約束已充分指定,則返回NO.這些結(jié)果是每個視圖所特有的。應(yīng)該為你的視圖層次結(jié)構(gòu)中的每個視圖單獨地測試布局。
內(nèi)在內(nèi)容大小
使用Auto Layout時,視圖的內(nèi)容在其布局中的重要性與約束不相上下。視圖內(nèi)容的大小通過每個視圖的intrinsicContentSize屬性表達,它描述了在數(shù)據(jù)未經(jīng)壓縮或裁剪的情況下表達視圖全部內(nèi)容所需的最小空間。該屬性源于每個視圖所呈現(xiàn)內(nèi)容的自然屬性。
通過視圖的內(nèi)在內(nèi)容大小,Auto Layout將視圖的框架盡可能地與其自然內(nèi)容相匹配。
壓縮阻力
壓縮阻力是指視圖保護其內(nèi)容的方式,壓縮阻力高的視圖能夠抵抗收縮,不允許內(nèi)容被剪切。setContentCompressionResistancePriority
內(nèi)容吸附
內(nèi)容吸附優(yōu)先級是防止在視圖與其核心內(nèi)容間作填充或直接伸展其核心內(nèi)容.
setContentHuggingPriority