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