ios6 引入了自动布局。虽然项目中所用不多。但是还是 早点资料看看 做个总结。 随着苹果分辨率越来越多。 类似自动布局肯定是越发重要了。
在ios 之前 有“autosizing” 就是 在父view 跟子view 引入了 “spring” 和 “strut” 的概念。 一个是弹簧? 意思应该是保证距离不会大于某一个值吧。 另外一个参数 是支柱。控制距离不小于吧。用这样的实现自动布局当然也有局限性。 就是当修改某一个view的位置等的时候。 也许需要大量的代码修改已经存在的自动布局的参数。而且控制起来很困难
自动布局通过创建 多个constraints (约束) 来显示view。而且不仅仅是父view和子view之间的可以存在约束。同级之间也可以存在约束。甚至可以不再同一个view上面的2个view也可以创建约束。
constraints不仅可以用明确的数字来表示。 还可以使用大于 小于等等。
constraints存在优先级0-1000 越大优先级越高
constraints操作的是view的内容 不是frame 这里讲的是alignment rects 这个东西不是很懂。需要时间去了解。
不过绝大部分正常情况 应该是跟frame相等的。
有的view 存在固定内容大小(比如button 会根据内容大小或者图片大小改变 内容大小)。constraints会在每个方向上自动分配2个constraints。 一个是阻止content的大小大于view的大小。另外一个是 阻止content的大小小于view的大小。Content Hugging Compression Resistance Priorities;
实际上用下面会说的 可视格式语言表达这个的意思是。当一个存在固定内容大小的view创建时候后。系统会自动加上4个约束。假设这个view的固定内容大小为100,50。让这个view不大于固定大小的约束的优先级是250.让这个view不小于固定内容大小的约束为750。
创建约束的3个方式:
1 在Interface Builder上面创建约束
首先需要注意的。约束缺一不可。要么不加约束。要么必须加全。一旦出现约束缺少或者冲突。都会报错。
当我们拖动view到界面上面去的时候。可以使用建议约束。
选中需要处理的view,点开下面第三个按钮。从上面到下的功能分别是:
1.更新frame:当你修改了一个view的约束的时候。view并不会变成你修改后的位置和大小。选中状态会有一个虚线的view。那个是真正的位置。这时候update一下会将view更新成修改后的大小后位置。
2更新 约束:跟上面的情况相反。如果你移动了view。根据现在view的位置重新生成约束。
3添加缺少的约束:如上所说 约束不能缺少。这个方法就是添加缺少的约束。
4重置为建议约束。
5清除约束
当你在界面上建立约束的时候。会有很多线出现。其中
绿色表示好的约束。
橙色表示缺少的约束。
红色表示冲突的约束。
2 代码编辑约束
很多时候 我们不能通过界面上面构建所有的约束。因为有的约束是动态的。这时候我们需要代码来构建 写个例子就行了。
[NSLayoutConstraint constraintWithItem:mybutton
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:mylabel
attribute:NSLayoutAttributeLeading
multiplier:1
constant:-10];
这里有一些注意点:
1.当你通过代码创建出来的对象。会存在默认的约束。再加约束会冲突 需要通过
setTranslatesAutoresizingMaskIntoConstraints:NO 来清除
3.约束加到影响的view的共同的父节点的最近的那一个view上面去。
3.可视格式表达语言
这个可能需要好好看文档就行了。写个例子吧:
// Get a reference to the superview
UIView *superview = self.view;
//Create a label
UILabel *mylabel = [[UILabel alloc]init];
[mylabel setTranslatesAutoresizingMaskIntoConstraints:NO]; mylabel.text = @"My Label";
//Create a button
UIButton *mybutton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[mybutton setTitle:@"My Button" forState:UIControlStateNormal]; [mybutton setTranslatesAutoresizingMaskIntoConstraints:NO];
//Add the button and label to the superview
[superview addSubview:mylabel];
[superview addSubview:mybutton];
// Get the views dictionary
NSDictionary *viewsDictionary =
NSDictionaryOfVariableBindings(mylabel, mybutton);
//Create the constraints using the visual language format NSArray *constraintsArray = [NSLayoutConstraint
constraintsWithVisualFormat:@"|-[mybutton]- [mylabel(==mybutton)]-|"
options:NSLayoutFormatAlignAllBaseline metrics:nil views:viewsDictionary];
//Work through the array of constraints, applying each to the superview
for (int i = 0; i<constraintsArray.count; i++) {
}
简单的表述一下
[view] 来表示一个view。
[view1][view2]表示2个view之间的约束
[view1]-[view2]表示2个view之间的间距
[mybutton1]-30-[mybutton2] 这个表示间距30
V:[mylabel]-50-[mybutton] 表示竖直方向。不加v默认是水平方向。当然也可以用 H。
[mybutton(100)] width 为 100;
[mybutton(<=100)] width 小于等于 100
[mylabel(==mybutton2)] mylabel 的width 等于 mybutton2 的宽度。
|-20-[mybutton1]-30-| 竖线表示父view[mybutton1(>=70@500)] @表示优先级