My Octopress Blog

A blogging framework for hackers.

使用代码来控制AutoLayout

Apple参考文档

创建Constraint

你可以使用NSLayoutConstraint来表示constrains。

如果要创建constraints,一般要使用 constraintsWithVisualFormat:options:metrics:views:

第一个参数是一个visual format string,这种visual format language已经尽可能的是自我解释的。一个view使用一个方括号来代表,view之间的连接用横杠来代表。visual format language的语法参见Visual Format Language

比如说,

上图可以表示为:

[button1]-12-[button2]

如果是标准的Aqua距离的话,可以不用标注数字

[button1]-[button2]

view的名字来自于参数views字典。key就是这里用到名字,而value是对应的view对象。

可以使用NSDictionaryOfVariableBindings来创建该字典,该函数使用view对象的名字来作为key值

NSDictionary *viewsDictionary =
    NSDictionaryOfVariableBindings(self.button1, self.button2);

NSArray *constraints =
    [NSLayoutConstraint constraintsWithVisualFormat:@"[button1]-[button2]"
                        options:0 metrics:nil views:viewsDictionary];

并不是每一种constraint都可以通过visual format language来表示的。比如有一种常用的constraint不能用该语言来表达,比如固定宽高比,这时候需要用这样的函数:

constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constraint:

比如上面contraint还可以这样创建

[NSLayoutConstraint constraintWithItem:self.button1 
                             attribute:NSLayoutAttributeRight
                             relatedBy:NSLayoutRelationEqual 
                                toItem:self.button2
                             attribute:NSLayoutAttributeLeft 
                            multiplier:1.0 
                              constant:-12.0];

Installing Constraints

我们必须把constraint加到view中,这个view应该是所有涉及到的view的祖先view,通常是最近的那个祖先view。

关于这个我们可以使用NSViewaddConstraint:

相关的函数还有:

  • removeConstraint:
  • constraints
  • fittingSize

参考资料

  • 最重要的一个开源库可以帮助我们不用写那么多无聊的代码

Masonry

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];