我在 iOS 中使用自动布局来尝试构建具有可变宽度的布局。我当前使用的约束的视觉格式是:
[self.scrollViewContainer addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-(>=32)-[viewToAdd(<=576)]-(>=32)-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(viewToAdd)
]];
也就是说:我希望两侧至少有 32px 的间距,并且我希望 viewToAdd
的最大宽度为 576px。这很好用,除了我希望 viewToAdd
在满足所有约束的同时用完所有可用空间。目前,我得到的 viewToAdd
只能与其固有内容大小一样宽,并且间距会根据需要增加。
有没有办法指定 viewToAdd
应该尽可能大?
最佳答案
您将必须在 View 上指定额外的约束,以便调整 View 的大小以填充剩余的可用空间。目前,您正在设置 View 的最小值和最大值,但没有设置任何具体的约束来为自动布局提供更完整的解决方案。除了宽度的上限之外,您还需要给它 1. 一个起点来解决 View 的宽度,方法是明确地给它一个较低优先级的宽度,或者 2. 给两边更多的间距刚性约束。
根据您所描述的内容,您需要限制您的 View ,为它提供一些更实质性的绑定(bind)到任一侧的 super View ,以便让系统解决宽度问题。由于您希望 View 本身的大小基于它的容器大小,因此您需要修改间距约束(上面的选项 2)。在上面的例子中,您只指定了一个最小间距,这将导致自动布局引擎发现以下任何约束解决方案对 400pt super View 有效:
|-32pt-[20pt]-------348pt-| <-- autolayout will probably choose this one
|-100pt----[20pt]---280pt-|
|-50pt--[20pt-]-----330pt-|
这可能不是您想要的。更重要的是, View 的宽度可以是 0-576pt 之间的任何值,这也可能不是您想要的。由于自动布局不知道您想要什么,它只是使用 View 的 intrinsicContentSize
来实现具体的大小限制。由于您选择 32pt 作为间距,第一步是给间距约束一些更实质性的说明,即告诉系统 View 和父 View 的边缘之间的间距应该为 32pts 除非 View 的宽度>576pts。您可以在 VFL 字符串中这样做:
"H:|-(>=32,==32@900)-[viewToAdd(<=576)]-(>=32,==32@900)-|"
这是说:“viewToAdd
的最大宽度应为 576pts,并且其自身与其父 View 之间的填充宽度为 32pts。如果父 View 的大小超出最大值viewToAdd
的宽度加上 64pts 的初始填充,两侧的填充应该增长以继续解决约束集。”
这导致以下约束对于 400pt super View 是正确的:
|-32pt--[336pt]--32pt-|
如果您希望 viewToAdd
在 View 超出最大值时保持其父 View 居中,您必须将选项 NSLayoutFormatAlignAllCenterX
传递给 [NSLayoutConstraint -constraintsWithVisualFormat:]
中的 >options 参数。如果您没有在填充上设置 >=32
约束,或者没有在填充的 ==32上设置低于 1000 的优先级(“必需”约束优先级) code> 约束,那么你的 superview 将无法超过 640pts。
关于ios - 在 iOS 上使用自动布局如何指定 View 应占用尽可能多的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132609/