调整UI的布局总是令人头大,我们需要用很大一部分代码来设置UI的布局,使得他能在不同的版本,不同的设备上友好显示。嗨...做人难,做程序员更难。
为了更好的帮我们解决这个问题,苹果从OS X引进了Auto Layout,我们来稍微了解一下:
苹果注意到,一大部分的的界面布局可以用一个方程来解决,即:
object1.property1 = (object2.property2 * multiplier) + constant value
ios用NSLayoutConstraint来包装了这个方程。不过每一个constraint对象只能包装一个方程。如果你想把一个button置于父控件的中间,你就不得不用两个constraint对象来分别包装x坐标的等式,与y坐标的等式。等式内容如下:
button.center.x = (button.superview.center.x * 1) + 0
button.center.y = (button.superview.center.y * 1) + 0
不过这还是有些麻烦,本章里面我们将学到Visual Format Language,这个更NB,更好用。
<一>
constrain的使用规则:
(1)如果这两个view的直接父控件相同,则把constraint加到直接父控件里面
(2)如果其中一个是另一个的父控件,则加到父控件里面
(3)如果这两个view的直接父控件不同,但某个祖父控件相同,则加到那个祖父控件里面。
<二>
constrain是如何包装那个等式的呢?
先看下类方法NSLayoutConstraint constraintWithItem:<#(id)#> attribute:<#(NSLayoutAttribute)#> relatedBy:<#(NSLayoutRelation)#> toItem:<#(id)#> attribute:<#(NSLayoutAttribute)#> multiplier:<#(CGFloat)#> constant:<#(CGFloat)#>
constraintWithItem: 对应object1
attribute:对应property1
relatedBy:对应方程中的等号,也可以是大于,小于
toItem:对应object2
attribute:对应property2
multiplier:对应方程中的multiplier
constant:对应方程中的constant value
<三>
如何把创建出来的contrain加到适当的view里面去呢?
addConstraint: 加入一个contraint
addConstraints: 加入一堆contraints (NSArray)
利用Auto Layout可以完成很多事情。但是,随着认识的深入,我们发现Auto Layout 自动给我们创建了很多的constraints。所以我们的代码也会变得越来越难以控制。因此,苹果创建了Visual Format Language。通过这个我们可以很轻松的表达我们想要的效果。比如让两个按钮间隔100points。我们可以这样写 [button1]-100-[button2]。
对于这样的写法,constraint也有相应的类方法constraintsWithVisualFormat: options:metrics:views:
constraintsWithVisualFormat: Visual Format Language表达式(NSString)
options: NSLayoutFormatOptions 一般传0
metrics: 常量值字典,为简单起见,我们这里先传0
views: 使用这个表达式的view的dictionary。用NSDictionaryOfVariableBindings来创建此Dictionary.
有了这些知识铺垫,我们可以开始学习这章的知识了。