天天看點

Auto Layout 布局限制類

建構布局限制

布局限制(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

Auto Layout 布局限制類

一進制限制:

不是所有限制都引用兩個視圖。有些限制僅對一個視圖進行操作,尤其是那些處理視圖尺寸的限制。第二項設定為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:方法删除該限制。雖然這兩個限制是等價的,但它們不是同一個限制。

要解決這個問題,是在第一次添加限制時将它存儲在一個局部變量中,以儲存該限制。