构建布局约束
布局约束(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(常数)元素。
约束数学:
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:方法删除该约束。虽然这两个约束是等价的,但它们不是同一个约束。
要解决这个问题,是在第一次添加约束时将它存储在一个局部变量中,以保存该约束。