17

我在 iOS 中使用自动布局来尝试构建具有流体宽度的布局。我当前使用的约束的视觉格式是:

[self.scrollViewContainer addConstraints:[NSLayoutConstraint 
     constraintsWithVisualFormat:@"H:|-(>=32)-[viewToAdd(<=576)]-(>=32)-|" 
                         options:0 
                         metrics:nil  
                           views:NSDictionaryOfVariableBindings(viewToAdd)
]];

也就是说:我希望两边的最小间距为 32px,并且我希望viewToAdd最大宽度为 576px。这很好用,只是我希望在viewToAdd满足所有约束的同时用尽所有可用空间。目前,我得到了viewToAdd唯一一个与其内在内容大小一样宽的宽度,并且间距根据需要增长。

有没有办法指定viewToAdd应该尽可能大?

4

2 回答 2

35

您将不得不在视图上指定额外的约束,以使其调整视图的大小以填充剩余的可用空间。目前,您正在设置视图的最小值和最大值,但没有设置任何具体的约束来为自动布局提供更完整的解决方案。除了宽度的上限之外,您还需要给它 1. 一个起点来解决视图的宽度,方法是明确地给它一个较低优先级的宽度,或者 2. 给两边的间距多一些刚性约束。

根据您所描述的,您需要约束您的视图,使其与任一侧的超级视图有更多实质性的绑定,以便让系统解决宽度问题。由于您希望根据容器的大小来设置视图大小,因此您需要修改间距约束(上面的选项 2)。在上面的例子中,您只指定了最小间距,这将导致自动布局引擎发现以下任何约束解决方案对于 400pt 超级视图是有效的:

|-32pt-[20pt]-------348pt-| <-- autolayout will probably choose this one
|-100pt----[20pt]---280pt-|
|-50pt--[20pt-]-----330pt-|

这可能不是你想要的。更重要的是,视图的宽度可以在 0-576pt 之间,这也可能不是您想要的。由于自动布局不知道你想要什么,它只是使用intrinsicContentSize视图的具体尺寸约束。由于您选择 32pt 作为间距,第一步是给间距约束一些更实质性的指令,即告诉系统视图边缘和父视图之间的间距应该是32pts,除非视图的宽度是>576 分。你会在你的 VFL 字符串中这样做:

"H:|-(>=32,==32@900)-[viewToAdd(<=576)]-(>=32,==32@900)-|"

这表示:“viewToAdd最大宽度应为 576pts,并且在其自身与其父视图之间有 32pts 的填充。 如果父视图的大小超过最大宽度viewToAdd加上 64pts 的初始填充,则两侧的填充应按顺序增长继续求解约束集。”

这导致以下约束对于 400pt 超级视图是正确的:

|-32pt--[336pt]--32pt-|

如果您希望viewToAdd在视图增长超过最大值时保持在其超级视图的中心,则必须将选项传递给 in 中NSLayoutFormatAlignAllCenterXoptions参数[NSLayoutConstraint -constraintsWithVisualFormat:]。如果您没有>=32在 padding 上设置约束,或者没有在 padding 的约束上设置低于 1000(“必需”约束优先级)的优先级==32,那么您的 superview 将无法增长到 640pts 以上。

于 2012-10-30T19:39:41.543 回答
1

不确定这是否完全回答了这个问题,但对于那些使用 Storyboard 的人:我发现您可以为父视图的左侧和右侧的距离添加宽度约束和约束。如果您随后将宽度约束更改为 '<=' 而不是 '=' 并将距离约束(前导和尾随)的优先级设置为 750,则视图将最大到最大宽度,尊重距离约束如果视野太小。

现有的约束

于 2016-02-28T11:37:20.687 回答