方法一:
<#约束视图#>.translatesAutoresizingMaskIntoConstraints = NO;
[<#约束视图的父视图#> addConstraint:[NSLayoutConstraint constraintWithItem:<#约束视图#> attribute:<#约束视图的NSLayoutAttribute#> relatedBy:<#NSLayoutRelation#> toItem:<#参考视图#> attribute:<#参考视图的NSLayoutAttribute#> multiplier:<#约束视图的NSLayoutAttribute相对于参考视图的NSLayoutAttribute的倍数#> constant:<#约束基础上的额外量#>]];
/*
第一个参数:约束视图view1
第二个参数:约束视图view1的attribute属性
第三个参数:指定约束视图和参考视图的关系relation
第四个参数:参考视图view2(可以为空)
第五个参数:参考视图view2的attribute属性
第六个参数:视图view1的指定属性是参照视图view2指定属性的多少倍
第七个参数:视图view1的指定属性需要加的浮点数
*/
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c
例子:
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:view];
view.translatesAutoresizingMaskIntoConstraints = NO;
//二分之一宽(父视图调用addConstraint)
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:(NSLayoutAttributeWidth) relatedBy:(NSLayoutRelationEqual) toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0]];
//二分之一高
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:(NSLayoutAttributeHeight) relatedBy:(NSLayoutRelationEqual) toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]];
//垂直对齐
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:(NSLayoutAttributeCenterX) relatedBy:(NSLayoutRelationEqual) toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
//水平对齐
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:(NSLayoutAttributeCenterY) relatedBy:(NSLayoutRelationEqual) toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
NSLayoutAttribute枚举说明:
NSLayoutAttributeLeft:视图的左边
NSLayoutAttributeRight:视图的右边
NSLayoutAttributeTop:视图的上边
NSLayoutAttributeBottom:视图的底边
NSLayoutAttributeLeading:在习惯有左向右看的地区,相当于NSLayoutAttributeLeft;在习惯有右向左看的地区,相当于NSLayoutAttributeRight
NSLayoutAttributeTrailing:在习惯有左向右看的地区,相当于NSLayoutAttributeRight;在习惯有右向左看的地区,相当于NSLayoutAttributeLeft
NSLayoutAttributeWidth:视图的宽度
NSLayoutAttributeHeight:视图的高度
NSLayoutAttributeCenterX:视图的中心x轴
NSLayoutAttributeCenterY:视图的中心y轴
NSLayoutAttributeLastBaseline:相当于NSLayoutAttributeBaseline
NSLayoutAttributeBaseline:文本底标线,在大多数视图中等同于NSLayoutAttributeBottom;在少数视图,如UILabel,是指字母的底部出现的位置
NSLayoutAttributeLastFirstline:文本上标线,在大多数视图中等同于NSLayoutAttributeTop;在少数视图,如UILabel,是指字母的上部出现的位置
NSLayoutAttributeNotAnAttribute:没有
NSLayoutRelation 枚举说明
NSLayoutRelationLessThanOrEqual 视图关系小于或等于
NSLayoutRelationEqual 视图关系等于
NSLayoutRelationGreaterThanOrEqual 视图关系大于或等于
注意:
- 添加约束前确定已经把需要布局的子view添加到父view上了
- 一定要禁止将Autoresizing Mask转换为约束(setTranslatesAutoresizingMaskIntoConstraints设置为NO)
- 要把约束加在父view上
- 因为iOS中原点在左上角所以使用offset时注意right和bottom用负数
- 如果是设置view自身的属性,不涉及到与其他view的位置约束关系。比如view自身的宽、高等约束时,方法constraintWithItem:的第四个参数view2(secondItem)应设为nil;且第五个参数attire(secondAttribute)应设为NSLayoutAttributeNotAnAttribute 。
- 在设置宽和高这两个约束时,第三个参数relatedBy使用的是 NSLayoutRelationGreaterThanOrEqual,而不是 NSLayoutRelationEqual。因为 Auto Layout 是相对布局,所以通常你不应该直接设置宽度和高度这种固定不变的值,除非你很确定视图的宽度或高度需要保持不变。
网友评论