AutoLayout是iOS6开始引入的一种布局技术,专门用来做UI界面布局的。用来解决Frame布局在多屏幕尺寸适配不足的问题。
一个NSLayoutConstraint 对象就是一条约,约束的创建有2种方法。
+(instancetype)constraintWithItem:(id)view1
attribute:(NSLayoutAttribute)attr1
relatedBy:(NSLayoutRelation)relation
toItem:(nullable id)view2
attribute:(NSLayoutAttribute)attr2
multiplier:(CGFloat)multiplier
constant:(CGFloat)c;
函数的对照公式为: view1.attr1 <relation> view2.attr2 * multiplier + constant
注意:如果约束不需要第4个参数(view2),将它设为nil,第五个参数(attr2)设为NSLayoutAttributeNotAnAttribute
参数 | |
---|---|
view1 | 要进行约束的view |
attr1 | View1要约束的属性 |
relation | 相对于目标view(view2)的约束关系 |
view2 | view1约束的参照物 |
attr2 | view2作为参照的属性 |
multiplier | 指定一个与view2属性相乘的乘数multiplier |
c | 指定一个与(view2属性 * multiplier 后)相加的浮点数constant |
// 红色View设置自身的宽高为100,相对于父组件居中
UIView *redView = [[UIView alloc] init];
[redView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:redView];
//使用Auto Layout约束,禁止将Autoresizing Mask转换为约束
[redView setTranslatesAutoresizingMaskIntoConstraints:NO];
NSLayoutConstraint *xConstraint = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0];
NSLayoutConstraint *yConstraint = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0];
NSLayoutConstraint *wConstraint = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:100];
NSLayoutConstraint *hConstraint = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:100];
NSArray *array = [NSArray arrayWithObjects:xConstraint, yConstraint, wConstraint, hConstraint, nil];
[self.view addConstraints:array];
效果图
网友评论