uikit——Auto Layout——constraint

来源:互联网 发布:软件中举报是什么意思 编辑:程序博客网 时间:2024/05/21 19:49

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)