2014-09-30
/* Create constraints explicitly. Constraints are of the form "view1.attr1 = view2.attr2 * multiplier + constant" If your equation does not have a second view and attribute, use nil and NSLayoutAttributeNotAnAttribute. */ +(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
例如:当我们使用如下的代码的时候
NSLayoutConstraint* layout = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-10];
对应的约束是“button的底部(y) = superview的底部 -10”。这个方法比较简单,理解公式即可。
在创建完约束后,你需要把他添加到view上才能生效,这里 对应的代码是
[superView addConstraint:layout];添加的规则很简单,分为下面3条:
__weak UIView* a; //假设 a 已经存在了 UIView* b = [[UIView alloc] init]; b.translatesAutoresizingMaskIntoConstraints=NO; //一定记住把这个关了 NSDictionary* dictionaryView = NSDictionaryOfVariableBindings(b); NSArray* hLayout = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[b]-40-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:dictionaryView]; NSArray* vLayout=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[b]-20-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:dictionaryView]; [a addConstraints:hLayout]; [a addConstraints:vLayout];
解释一下上面的代码,我们假定 a(superview) 已经存在的情况下,创建了一个 b(subview)。之后,对 b 做一个绑定,相当于这样一行代码:
NSDictionary* dictionaryView=[NSDictionary dictionaryWithObject:b forKey:@"b"];之后,我们建立两个约束 分别是水平方向和垂直方向上的约束,其中‘|’表示superview的边界,[]表示元素,-x-表示相距了x的点(retina上像素和点有一定差距),NSLayoutFormatAlignAllBaseline 是默认的排版方式,即从左向右,从上往下的排版。 dictionaryView 是绑定了 view 的名字和对象的字典.最后,我们按照添加约束的规则,找到a和b的“父节点 a”,最后让a把这一系列的约束加上去,这样就完成了一个对 b 相对于 a 的一个约束。