我在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
应该尽可能大?
答案 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)