每一个布局约束就是一个明确的线性变化规则,在数学上是以一次函数的形式表示,即:
y = m * x + c
其中的firstItem与secondItem分别是界面中受约束的视图与被参照的视图。它们不一定非得是兄弟关系或者父子关系,只要它们有着共同的祖先视图即可,这一点可是autoresizingMask无法做到的。
firstAttribute与secondAttribute分别是firstItem与secondItem的某个布局属性(NSLayoutAttribute):
当我们需要为某个视图指定固定宽度或者高度时,这时候secondItem为nil,secondAttribute为NSLayoutAttributeNotAnAttribute。relation定义了布局关系(NSLayoutRelation):
布局关系不仅限于相等,还可以是大于等于或者小于等于,这种不等关系在处理UILabel、UIImageView等具有自身内容尺寸的控件(自身内容尺寸参见本系列第五篇文章)时非常常用。举个简单的例子,UILabel的长度会随文字的长度而变化,那么我们可以向UILabel控件添加两个约束,分别是“长度大于等于50”与“长度小于等于200”。这样,当文字很少时,宽度也至少为50;当文字非常多时,宽度也不会超过200。
multiplier即比例系数。constant即常量。
因此,每个约束就对应如下关系:
firstItem.firstAttribute {==,<=,>=} secondItem.secondAttribute * multiplier + constant
//logoImageView左侧与父视图左侧对齐NSLayoutConstraint* leftConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f];//logoImageView右侧与父视图右侧对齐NSLayoutConstraint* rightConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f];//logoImageView顶部与父视图顶部对齐NSLayoutConstraint* topConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f];//logoImageView高度为父视图高度一半NSLayoutConstraint* heightConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeHeight multiplier:0.5f constant:0.0f];//iOS 6.0或者7.0调用addConstraints//[self.view addConstraints:@[leftConstraint, rightConstraint, topConstraint, heightConstraint]];//iOS 8.0以后设置active属性值leftConstraint.active = YES;
rightConstraint.active = YES;
topConstraint.active = YES;
heightConstraint.active = YES;
将一个已经设置好frame并使用autoresizingMask的视图添加到一个使用自动布局的视图中时,运行时需要隐式地将前者的frame和autoresizingMask转化为自动布局约束(这些隐式转换的约束的类型为NSAutoresizingMaskLayoutConstraint),这样才能明确其位置与尺寸而不会导致约束的缺失。这个隐式转换的过程,是由UIView的translatesAutoresizingMaskIntoConstraints属性的值决定的。默认情况下,为了保证兼容性,该值为YES,表示需要自动进行隐式转换
ios autolayout中NSLayoutAttributeLeft(Right)与NSLayoutAttributeLeading(Trailing)区别
在大天朝,这两种效果是一致的