iOS中的相对布局:AutoLayout

Autosizing mask存在的问题

适当地设置Autosizing mask,可以使得当superview的size变化时,view也可以从一定程度上适应。之所以说是一定程度,是因为Autosizing mask只是一个定性的适应,view只知道需要resize了,但它并不知道要resize到什么程度,无法定量。 Autolayout教程1 的开篇有一个很好的例子来说明Autosizing mask的局限性。

什么是Auto Layout?

Auto Layout是由一系列的constraint构成的。constraint就是描述view在界面上的现实规则。

view1.attribute = view2.attribute * m + b

attribute可以是以下其中之一:left, right, top, bottom, leading, trailing, width, height, centerX, centerY, and baseline. 可以看iOS developer library文档:iOS Developer Library

Auto Layout的强大之处

Auto Layout的使用

使用xib:

使用代码:

在代码中设置constraint有三步:

NSLayoutConstraint *myConstraint =[NSLayoutConstraint
                            constraintWithItem:_button
                                     attribute:NSLayoutAttributeCenterY
                                     relatedBy:NSLayoutRelationEqual
                                        toItem:superView
                                     attribute:NSLayoutAttributeCenterY
                                    multiplier:1.0
                                      constant:0];  

上面这个描述的就是:_button.CenterY = superView.CenterY

可以看这个例子:用代码实现AutoLayout

看起来还是有点烦琐的。但是有一些第三方库做了封装,可以更方便的用代码来创建constraint。 比如FLKAutolayout,KeepLayout, UIView-AutoLayout等。

推荐FLKAutolayout。比如:

  [_label constrainLeadingSpaceToView:_button predicate:@“>=10”];

就可以设置label和button的左右间距>=10。

xib和programming的选择:

看个人习惯,我觉得用xib更方便一些。AutoLayout的核心在于设置constraint,而用xib相比于用代码可以得到更多的好处:

用代码也有一些好处:

一些demo

还可以参考Autolayout布局TableViewCell