ios 自动布局小结

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。

H:[label(<=100@250)]
 
H:[label(>=100@750)]
 
V:[label(<=50@250)]
 
V:[label(>=50@750)]
这里有个疑问 。 查过很多资料。的确都写的优先级为250.但是我自己建立的项目貌似是251. 不过应该不是大问题。需要处理这个的时候。避开250,251铁定没问题。更何况这个值也是可以修改的。


创建约束的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 来清除

2.通过界面上创建的约束可以 IBOutlet 到代码中去。

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)] @表示优先级


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值