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

sim*_*mon 17 ios autolayout ios6

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

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

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

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

lar*_*cus 35

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

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

|-32pt-[20pt]-------348pt-| <-- autolayout will probably choose this one
|-100pt----[20pt]---280pt-|
|-50pt--[20pt-]-----330pt-|
Run Code Online (Sandbox Code Playgroud)

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

"H:|-(>=32,==32@900)-[viewToAdd(<=576)]-(>=32,==32@900)-|"
Run Code Online (Sandbox Code Playgroud)

这说:" viewToAdd最大宽度应为576pts,并且在它自身之间有填充,并且它的超视距为32pts. 如果超视图的大小超过最大宽度viewToAdd加上初始填充64pts,则两侧的填充应按顺序增长继续解决约束集."

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

|-32pt--[336pt]--32pt-|
Run Code Online (Sandbox Code Playgroud)

如果您希望viewToAdd在视图超出最大值时保持其超级视图的中心,则必须将选项传递NSLayoutFormatAlignAllCenterXoptions参数[NSLayoutConstraint -constraintsWithVisualFormat:].如果您没有>=32在填充上设置约束,或者没有在填充约束上设置低于1000("必需"约束优先级别)的优先级==32,那么您的超级视图将无法超过640pts.