iOS 自动布局:2 个可变大小的框和 1 个固定大小的框的问题

Posted

技术标签:

【中文标题】iOS 自动布局:2 个可变大小的框和 1 个固定大小的框的问题【英文标题】:iOS Autolayout: Issues with 2 variable sized boxes and 1 fixed sized box 【发布时间】:2014-10-02 12:54:49 【问题描述】:

我已经为这个问题苦苦思考了几个小时,并认为是时候问问其他人了。

我有 2 个大小必须相同的视图,在这两个视图中有 2 个大小可变的框(下图中的绿色和蓝色)和一个固定大小的框(粉红色) .

这是一个示例图像:

绿色和粉色框设置在顶部,蓝色框漂浮在它们下方。蓝色框与其他两个框的最低点的距离不得低于 15pt。这意味着如果绿色框变小(如下图所示),那么蓝色框应该与粉色框保持 15pt。

最后,由于单元格的高度是固定的,所以如果蓝色框变小,那么它应该留在其他框,但在其下方留出空间以填充视图的其余部分(因为它必须与在它旁边查看),我试着在这里拍照:

这里的关键是我们正在研究两者的较小视图。 (绿色和蓝色框都是标签,文本必须在框的顶部。)

我想出的最佳解决方案是添加:

green.bottom >=15 blue.top pink.bottom >=15 blue.top blue.bottom >=15 superview.bottom

但我得到了它们之间的“不平等约束歧义”,因为不平等还不够“好”。

【问题讨论】:

我很困惑你想要完成什么以及问题是什么 为了更清楚,我重做了解释。基本上我有两个视图和一个非常浮动的蓝色框,如果没有不等式约束模糊,我无法使用自动布局放置它,我想知道是否有更好的方法。 粉色框是否有固定尺寸限制?这些不平等需要有一个常数。您可以设置高度和宽度约束并在构建时将其删除。或者——更好的是——在你的视图控制器的 updateConstraints 方法中修改它们:你可以用约束来设置它的大小,而不是显式地设置粉色框视图的框架。然后,自动布局做正确的事。 安娜,是的,它同时设置了高度和宽度。虽然 rdelmar 基本上已经搞定了。 【参考方案1】:

您需要在蓝色视图与绿色和粉红色视图之间再添加两个约束。应该是,

green.bottom == 15 blue.top priority 900

pink.bottom == 15 blue.top priority 900

您的 >= 约束的默认优先级为 1000,这意味着它们是必需的。这将确保两个视图与蓝色视图的距离都不会超过 15 个点。添加这些具有较低优先级的新相等约束意味着系统将尝试满足它们,但它不是必须的。这将导致系统在不违反 >= 约束的情况下满足这两个相等约束中的哪一个。

我不确定视图底部需要什么约束(来自蓝色视图),因为我不确定你想要它的大小。

【讨论】:

嘿!我尝试了您的解决方案,它基本上是正确的。我发现我只需要添加 green.bottom ==15 blue.top priority 750 (xcode 说这很高,所以无论如何我们一起去吧)。这是因为它是可变高度,如果绿色盒子比粉色盒子短,那么它对两者都使用不等式约束。对于蓝底,我只是添加了另一个不等式,说明到底部的最小距离。但是感谢您为我指明了正确的方向! @BjarkeH.Søndergaard,在这种情况下没关系,但通常最好不要使优先级等于默认值之一(750、510、500、490、250、50 ) 因为这将使您的约束和某些系统设置的默认值之间的比较相等,因此对于哪个约束应该优先考虑不明确。最好根据情况选择 751 或 749(或者我相当随意的选择 900)。 啊,好吧,我明白了。谢谢你。虽然我仍然会声称您只能通过仅将约束添加到绿色来获得正确的结果(或者至少不能同时添加两者,因为两者都意味着如果绿色盒子延伸到粉红色盒子下方,则绿色盒子会被剪短)。跨度> @BjarkeH.Søndergaard,当然,添加一个可能是正确的方法,这取决于您如何设置绿色的大小。当我测试它时,添加两者都可以正常工作,但是您可能设置的绿色框的高度与我不同。

以上是关于iOS 自动布局:2 个可变大小的框和 1 个固定大小的框的问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 自动布局 - 动态调整 4 个方形视图的大小

以编程方式在 iOS 中自动布局

iOS 自动布局:3 列标签布局,中间列具有可变宽度

iOS - 自动布局 - 在方向更改时按比例增加/减小视图大小

根据数量动态布局固定大小的 div

使用固定大小的子视图和自动布局调整 UIView 的大小不起作用