自动布局 - 以编程方式定义异常约束

时间:2013-11-30 16:17:38

标签: ios objective-c uiview uikit

我正在尝试查找一些相对非标准布局的示例,但我发现的所有文档仅提供了居中或与superview边框对齐的示例,或者给出了固定数字作为空格和大小。 您能否建议以编程方式定义以下约束:

A 即可。对角线观点:

enter image description here

即可。查看它的第三个超视图的边界(或其他一些不是中间的比例)

enter image description here

C 即可。 superview边框的两个标准空间(如此| - [v1],但有双倍空格)

任何讨论类似案例的文件也会受到高度赞赏:)

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以使用详细NSLayoutContraint方法创建任何无法用可视格式语言表达的约束。

A :您需要两个约束来准确描述您想要的内容。在这种情况下,您希望v1的上边缘和v2的下边缘相同。同样适用于左右边缘。

NSLayoutConstraint *constraint;
constraint = [NSLayoutConstraint constraintWithItem:v1
                                          attribute:NSLayoutAttributeTop
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:v2
                                          attribute:NSLayoutAttributeBottom
                                         multiplier:1.0
                                           constant:0.0];
[self.view addConstraint:constraint];

constraint = [NSLayoutConstraint constraintWithItem:v1
                                          attribute:NSLayoutAttributeRight
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:v2
                                          attribute:NSLayoutAttributeLeft
                                         multiplier:1.0
                                           constant:0.0];
[self.view addConstraint:constraint];

B :这次你希望v1和v2的上边缘相同:

NSLayoutConstraint *constraint;
constraint = [NSLayoutConstraint constraintWithItem:v2
                                          attribute:NSLayoutAttributeTop
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:v1
                                          attribute:NSLayoutAttributeTop
                                         multiplier:1.0
                                           constant:0.0];
[self.view addConstraint:constraint];

橙色视图的水平位置使用什么约束取决于您想要什么。你想要一个固定的边距到蓝色视图的右边缘吗?

constraint = [NSLayoutConstraint constraintWithItem:v2
                                          attribute:NSLayoutAttributeLeft
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:v1
                                          attribute:NSLayoutAttributeLeft
                                         multiplier:1.0
                                           constant:rightMargin];
[self.view addConstraint:constraint];

C :我认为你不能像这样指定一个双重空间。你可以使用一个丑陋的技巧,并在标准空间之间插入一个不可见的(宽度0)视图,如下所示:

|-[invisibleView(0)-[v1]

或者你可以弄清楚标准余量是多少,并使用两倍的值作为常数:

|-(doubleMargin)-[v1]