在iOS上使用autolayout如何指定视图应占用尽可能多的空间?

时间:2012-10-30 04:24:43

标签: ios ios6 autolayout

我在iOS中使用autolayout尝试构建具有流体宽度的布局。我目前使用的约束的可视格式是:

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

也就是说:我希望两边至少有32px的间距,我希望viewToAdd的最大宽度为576px。这很有效,除了我希望viewToAdd在满足所有约束的同时耗尽任何可用空间。目前我的viewToAdd只有其内在的内容大小,并且间距会根据需要增长。

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

2 个答案:

答案 0 :(得分:35)

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

根据您所描述的内容,您需要限制视图,以便为任何一方的superview提供更多实质性绑定,以便让系统解决宽度问题。由于您希望根据容器的大小来确定视图大小,因此您需要修改间距约束(上面的选项2)。在上面的例子中,您只指定了一个最小间距,这将导致以下任何约束解决方案被400lay superview的autolayout引擎视为有效:

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

这可能不是你想要的。更甚者,视图的宽度可以是0-576pt之间的任何值,这也可能不是你想要的。由于autolayout不知道你想要什么,它只是使用视图的intrinsicContentSize来获得具体的大小限制。由于你选择32pt作为间距,第一步是给间距约束一些更实质的指令,即告诉系统在视图的边缘和superview之间应该 32pts 除非视图的宽度> 576pts。你可以在你的VFL字符串中这样做:

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

这说:“viewToAdd的最大宽度应为576pts,并且在它自身之间有填充,并且它的超视距为32pts。如果,超视图的大小超出{的最大宽度{ {1}}加上64pts的初始填充,任意一侧的填充应增长,以便继续解决约束集。“

这导致以下约束对于400pt superview是正确的:

viewToAdd

如果您希望|-32pt--[336pt]--32pt-| 在视图超出最大值时保持其超级视图的中心位置,则必须将选项viewToAdd传递给NSLayoutFormatAlignAllCenterX参数{ {1}}。如果您没有在填充上设置options约束,或者没有在填充的[NSLayoutConstraint -constraintsWithVisualFormat:]约束上设置低于1000(“必需”约束优先级别)的优先级,那么您的超级视图将无法超过640pts。

答案 1 :(得分:1)

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

The constraints in place