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

Posted

技术标签:

【中文标题】自动布局 - 以编程方式定义异常约束【英文标题】:Auto Layout - programatically defining unusual constraints 【发布时间】:2013-11-30 16:17:38 【问题描述】:

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

一个。对角线视图:

B。将视图放在它的超级视图边框的第三个(或其他一些不是中间的比例)

C。父视图边界的两个标准空格(如 |-[v1],但有双空格)

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

提前致谢!

【问题讨论】:

如果您真的想掌握这个主题,请获取一些专家资料,例如 Erica Sadun 的书或 Matt Neuburgs ios 7 的书。我得到了两个,因为我们将阅读并重新阅读 Apple 指南。 【参考方案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]

【讨论】:

对于示例 B 中的水平位置,您可以在父视图的右侧使用 0.33 的乘数参数(和一个常数 0),这会将视图的 1/3纵向和横向都从左边距开始。

以上是关于自动布局 - 以编程方式定义异常约束的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加控制器视图时自定义自动布局约束被破坏

如何以编程方式使用自动布局添加自定义视图

模糊自动布局约束(以编程方式添加)

如何在 ios swift 中以编程方式创建自动布局等宽约束?

以编程方式添加约束会破坏自动布局约束

以编程方式应用自动布局约束时无法同时满足约束