constraint
constraint,即約束,本質是線性方程式,線性方程式格式:item1.attribute1 relationship multiplier * item2.attribute2 + constant
解釋:
- item1:view或layout guide,不能爲nil
- attribute1:item1屬性
- relationship:=,>=,<=
- multiplier:乘數
- item2:view或layout guide,可left blank
- attribute2:item2屬性,如果item2 left blank,attribute2必須爲Not An Attribute
- constant:常數,偏移量
注意:
- item1和item2可爲同一view或layout guide,比如設置item的width和height aspect ratio
- 可直接設置constant給width或height,此時item2 left blank,attribute2設置爲Not An Attribute,multiplier設置爲0.0
attribute
attribute分兩類:
- location attribute
- size attribute
注:特殊的Not An Attribute
location attribute:
- leading(x-axis),trailing(x-axis)
- top(y-axis),bottom(y-axis)
- left(x-axis),right(x-axis)
- center x(x-axis),center y(y-axis)
- baseline(y-axis)(text item特有,擁有一個或多個baseline attribute)
size attribute:
attribute詳解
- width(size),height(size):允許賦值constant,與width(size),height(size)創建constraint,值不允許爲負數
- top(y-axis),bottom(y-axis),baseline(y-axis):screen從高到低值遞增,與center y(y-axis),top(y-axis),bottom(y-axis),baseline(y-axis)創建constraint
- leading(x-axis),trailing(x-axis):從leading(x-axis)到trailing(x-axis)值遞增,對於left-to-right閱讀方向,leading(x-axis)在左,trailing(x-axis)在右,screen從左到右值遞增,對於right-to-left閱讀方向,leading(x-axis)在右,trailing(x-axis)在左,screen從右到左值遞增,與leading(x-axis),trailing(x-axis),center
x(x-axis)創建constraint
- left(x-axis),right(x-axis):screen從左到右值遞增,與left(x-axis),right(x-axis),center x(x-axis)創建constraint,避免使用left(x-axis)和right(x-axis),應使用leading(x-axis)和trailing(x-axis)代替,這樣才能適配國際化(各種語言閱讀方向不同)
- center x(x-axis),center y(y-axis):center x(x-axis)與center x(x-axis),leading(x-axis),trailing(x-axis),left(x-axis),right(x-axis)創建constraint,center y(y-axis)與center y(y-axis),top(y-axis),bottom(y-axis),baseline(y-axis)創建constraint
創建constraint
可創建各類constraint,但並非所有attribute都兼容,創建constraint時,遵守以下規則:
- size attribute和location attribute不能創建constraint
- constant不允許直接賦值給location attribute,但允許直接賦值給size attribute
- location attribute之間必須使用同一性multiplier(multiplier必須爲1),size attribute之間允許使用非同一性multiplier(multiplier不必然爲1)
- x-axis location attribute和y-axis location attribute不能創建constraint
- leading | trailing和left | right不能創建constraint
constraint是線性方程式,非賦值表達式(並非把右邊賦值給左邊),爲使constraint錯誤更少,可讀性更好,保持constraint書寫風格一致性,以下constraint書寫規則可遵守:
- 整數multiplier好過小數multiplier
- 正數constant好過負數constant
- view按照attribute順序顯示:leading前(左)trailing後(右),top前(左)bottom後(右),left前(左)right後(右)
無二義性且可滿足layout指constraint對應線性方程組有解且只有唯一解
- 二義性:constraint對應線性方程組有多組解,即有多個解決方案
- 不可滿足:constraint對應線性方程組無解,即無合法解決方案
無二義性且可滿足layout簡易規則:
- 每個view在每個方向上(x-axis或y-axis)使用兩條constraint(包括location constraint和size constraint)
檢查是否爲無二義性且可滿足layout:
- 減一條constraint,二義性error
- 加一條constraint,引入衝突,無可滿足
不等constraint
不等constraint指constraint對應線性方程式中relationship爲>=或<=
一旦使用不等constraint,每個view在每個方向上(x-axis或y-axis)使用兩條constraint(包括location constraint和size constraint)規則不再遵守,一條相等constraint可用兩條不等constraint代替,但一條相等constraint和兩條不等constraint並非互爲等價關係
constraint優先級
constraint優先級1~1000,1000爲required,其餘爲optional,constraint默認優先級爲required,required constraint必須滿足,否則無可滿足layout
計算layout solution時將constraint按優先級從高到低排序,然後按優先級從高到低計算constraint:
- 如果constraint優先級爲required,必須滿足,否則無可滿足layout
- 如果constraint優先級爲optional,能滿足則滿足,不能滿足skip
- 根據上述規則計算出來的layout唯一(無二義性),則就是最終無二義性且可滿足layout,如果多個(二義性),則使用skipped optional constraint從多個layout中選擇一個layout使其最接近滿足skipped constraint,該layout就是最終二義性且可滿足layout
optional constraint和不等constraint經常搭配一起使用
注1:不要以爲要使用所有1000個優先級,自定義優先級應設置在系統預定義優先級附近,一般比系統預定義優先級高或低一二個點,否則你應該檢查自己的layout邏輯
注2:系統預定義優先級包括low(250),medium(500),high(750),required(1000)