Auto Layout 佈局約束類

Auto Layout 佈局約束類
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

構建佈局約束

佈局約束(NSLayoutConstraint的例項)定義了關於檢視的物理集合特性的規則。佈局約束指定了檢視的佈局方式,以及檢視與同一層次結構中其他檢視的關係。

NSLayoutAttributeLeft = 1,
NSLayoutAttributeRight,
NSLayoutAttributeTop,
NSLayoutAttributeBottom,
檢視的左邊、右邊、頂部和底部

NSLayoutAttributeLeading,
NSLayoutAttributeTrailing,
檢視的前邊和後邊。在類似英語的場合中,前邊和後邊對應於左邊和右邊;在從右到左的場合,特別是在阿拉伯語和希伯來語的情況下,前邊和後面對應於左邊和右邊

NSLayoutAttributeWidth,
NSLayoutAttributeHeight,
檢視的寬度和高度

NSLayoutAttributeCenterX,
NSLayoutAttributeCenterY,
檢視的中心點。在兩個座標軸的方向上分別表示為centerX和centerY

NSLayoutAttributeLastBaseline,
檢視的基線。通常是指在檢視的底部上方放置文字的地方

NSLayoutAttributeNotAnAttribute = 0
佔位符。當與另一個約束的關係中沒有用到某個屬性時可以使用該佔位符,如果再設定寬度或高度時就會用到這種佔位符

NSLayoutRelationLessThanOrEqual = -1,
NSLayoutRelationEqual = 0,
NSLayoutRelationGreaterThanOrEqual = 1,
約束。這種約束允許將屬性通過等式(==)和不等式(<=和>=)相互關聯


佈局約束類

NSLayoutConstraint *wlcs = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:100];
wlcs.priority = 500;
[redView addConstraint:wlcs];

數學規則通過構建NSLayoutConstraint類的例項來建立。

priority:該屬性儲存約束的優先順序值。約束優先順序是可讀的(有時是可設定的)屬性。優先順序範圍1(最低優先順序)到1000(必須的優先順序)。
嚴格來講,優先順序是浮點數:
typedef float UILayoutPriority;
typedef float NSLayoutPriority;
蘋果公司提供了不同的平臺特有的優先順序列舉值。

firstItem與secondItem:這兩個屬性是指檢視。約束可能僅涉及一個檢視的屬性,也可能涉及兩個檢視之間的關係。有效約束的第一項總是非nil項。第二項可能是也可能不是nil。

firstAttribute與secondAttribute:這兩個屬性是約束系統中的“名詞”,它們描述檢視的對齊矩形的特徵,如左邊、右邊、中心和高度。如果不存在第二項,則將第二個屬性設定為NSLayoutAttributeNotAnAttribute。

relation:關係是約束系統中的“動詞”,它們指出屬性之間如何相互比較:相等(==)、大於等於(>=)、或者小於等於(<=)。
NSLayoutRelationLessThanOrEqual = -1,
NSLayoutRelationEqual = 0,
NSLayoutRelationGreaterThanOrEqual = 1,

multiplier和constant:這兩個屬性提供了代數元素,增強了約束系統的功能和靈活性。通過這兩個屬性,可以指出一個檢視是另一個檢視大小的一半,也可以指出一個檢視是將其父檢視偏移一定的距離而得到的。這兩個屬性都是浮點型值,它們對應於構成約束方程的m(乘數)和b(常數)元素。

約束數學:

不管約束是如何建立的,所有約束在本質上都是相等或不等關係,用公式表示如下:

y(關係)m * x b

R是指y和右邊算式的值之間的關係:

y R m * x b

y和x是表示各種檢視屬性,m是常數縮放因子,b是常數偏移值。

例如,“檢視B的左邊應位於檢視A的右邊15點處”,其關係方程如下圖所示:

檢視B的左邊 = 檢視A的右邊 15

y R m * x b

firstItem.firstAttribute (relation)
secondItem
.secondAttribute * multiplier constant

一元約束:
不是所有約束都引用兩個檢視。有些約束僅對一個檢視進行操作,尤其是那些處理檢視尺寸的約束。第二項設定為nil,其屬性設定為佔位符。
NSLayoutConstraint *wlcs = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:100];

不含檢視項的約束是不合法的。無法建立不含檢視項的有效約束。

當約束引用兩個檢視時,只有兩種合法情況:要麼一個檢視時另一個檢視的父檢視,要麼兩個檢視必須是某種型別的兄弟(即他們必須在同一個視窗下有一個非nil的共同檢視祖先)。

安裝約束的規則:
新增約束規則
1.對於兩個同層級view之間的約束關係,新增到它們的父view上
2.對於兩個不同層級view之間的約束關係,新增到他們最近的共同父view上
3.對於有層次關係的兩個view之間的約束關係,新增到層次較高的父view上

刪除約束:
兩個內建方法removeConstraint:和removeConstraints:可用來刪除給定檢視中的一個約束或者一個約束陣列。
假設你構建了一箇中心匹配約束,並將該約束新增到了你的檢視中。那麼,你不能用同樣的規則構建約束的另一個版本,並預期呼叫removeConstraint:方法刪除該約束。雖然這兩個約束是等價的,但它們不是同一個約束。
要解決這個問題,是在第一次新增約束時將它儲存在一個區域性變數中,以儲存該約束。

相關文章

程式語言 最新文章