建構布局限制
布局限制(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:方法删除該限制。雖然這兩個限制是等價的,但它們不是同一個限制。
要解決這個問題,是在第一次添加限制時将它存儲在一個局部變量中,以儲存該限制。