NSLayoutConstraint

NSLayoutConstraint

约束定义了两个用户界面对象必须满足约束布局系统的关系。每一个约束都是一个线性的方程式,就像下面一样:

item1.attribute1 = multiplier x item2.attribute2 + constant

在这个方程式中,attribute1和attribute2是自动布局调整去解决约束问题的变量。其他值都是我们在创建变量的时候自己定义的。例如,如果你正在定义两个按钮的关系位置,你可能会说:第二个按钮的前言应该是第一个按钮后沿8点。线性方程式表达这个关系就是下面这样:

button2.leading = 1.0 x button1.trailing + 8.0

自动约束然后会修改前沿和后沿的值去让方程式相等。需要注意的是:自动布局不仅仅是简单的指派值让方程式左右相等。相反的。为了满足约束,系统会修改可能一或者两个属性。

约束是方程式的实际意义是这样的:你可以交换两个元素的位置去更清晰的表达你希望要的关系。然而,如果你交换顺序,你必须颠倒乘数和常量。例如下面的这两个:

button2.leading = 1.0 x button1.trailing + 8.0

button1.trailing = 1.0 x button2.leading - 8.0

一个有效的布局定义式设置约束只有一种可能的解决方案。有效的布局也指清晰、没有矛盾的布局。有不仅一种解决方案的约束是模糊不清的。没有有效的解决方案的约束是矛盾的。

此外,约束不仅仅局限于等价关系。他们也可以用大于等于或者小于等于去描述两个属性之间的关系。约束有优先级,从1-1000。优先级为1000的约束是必须的。所有优先级小于1000是可选的。默认的情况下,所有约束都是必须得(优先级为1000)。

解决必须约束之后,自动布局尝试去解决所有其他可选约束的优先级(从高到低)。如果自动布局无法解决可选约束问题,它会尽可能地区接近渴望的结果,然后处理下一个约束。

这种不等式、等式和属性的组合,给你更大的灵活性和力量。通过连接倍数的约束,你可以定义布局,动态地随着用户界面的改变去动态调整元素的大小和位置。

创建约束

    • constraintsWithVisualFormat:options:metrics:views:
      创建一个被ASCII艺术视觉描述的字符串的约束。
      + (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;
    • constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
      创建一个定义的指定视图的两个属性之间关系的约束。
      + (instancetype _Nonnull)constraintWithItem:(id _Nonnull)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id _Nullable)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c 
  • Parameters
  • Description
  • view1
  • 约束左侧的视图
  • attr1
  • 约束左侧视图的属性
  • relation
  • 左侧约束和右侧约束的关系
  • view2
  • 右侧约束的视图
  • attr2
  • 约束右侧视图的属性
  • multiplier
  • 右侧约束的属性倍乘一个常数 作为得到修改过的一部分
  • c
  • 在倍乘的基础上再加上的一个常数,得到最优的修改过的属性
    • 返回值:返回一个约束对象。
      讨论:约束本质就是一个线性的等式:
      view1.attr1 <relation> multiplier x view2.attr2 + c
      如果你希望的约束没有第二个视图和属性,使用nil和NSLayoutAttributeNotAnAttribute.

你可能感兴趣的:(CONSTRAINT)