如何添加约束以使视图与最宽的其他两个视图一样宽?

Ben*_*ard 5 cocoa-touch uiview ios autolayout

例如,标签A,B和C.标签A的宽度应该更宽,B或C.

在视觉上,有些东西沿袭

@"H:[viewA(==MAX(viewB,viewC))]"
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 1

如果您想确保viewA至少同时与viewB和一样宽viewC,则使用两个单独的 VFL 语句@"H:[viewA(>=viewB)]"@"H:[viewA(>=viewC)]"

如果您还想确保 A 不会比viewB和/或的最大宽度更宽viewC,则可以定义一个可选约束(即优先级低于UILayoutPriorityRequired),使 的宽度viewA等于其中之一,例如:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:viewA
                                                              attribute:NSLayoutAttributeWidth
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:viewB
                                                              attribute:NSLayoutAttributeWidth
                                                             multiplier:1.0
                                                               constant:0.0];
constraint.priority = UILayoutPriorityDefaultLow;
[viewA.superview addConstraint:constraint];
Run Code Online (Sandbox Code Playgroud)

根据文档priority

如果约束“a == b”是可选的,则基于约束的布局系统将尝试最小化“abs(ab)”。

因此,如果viewB大于viewC,则该可选约束将得到满足,并且viewA将与 一样宽viewB。如果viewB小于viewC,约束系统将满足所需的@"H:[viewA(>=viewC)]"约束,但也会最小化abs(a-b),有效地使viewA宽度与 相同viewC

实际上,您可能不需要此可选viewA==viewB约束,但如果您想确保viewA不会比viewB和更宽viewC,则添加此最终可选约束。