uikit——Auto Layout——constraint

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:
  • width(size),height(size)

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)
發佈了244 篇原創文章 · 獲贊 5 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章