iOS自适应布局在高度未知的情况下

3
我正在尝试按如下方式设置我的视图

layout

每个视图包含一些子视图,例如标签和按钮。 对于我的项目,我必须使用自动布局。 具体来说,我正在使用一个名为FLKAutolayout的第三方库,它可以加快速度。 问题在于每个视图都有动态高度。 将每个视图的两侧固定到父视图的两侧是可以的。 但是,在垂直排列方面,我遇到了模糊的布局。 我尝试将视图1固定在父视图的顶部,将视图2的顶部固定在视图1的底部,将视图3的顶部固定在视图2的底部,依此类推。如果不将最底部的视图固定在父视图的底部,则什么也不会显示。如果我将最底部的视图固定在父视图的底部,则只有最顶部的视图被拉伸到整个屏幕的大小。如果我手动约束高度为任意值,则显示正常。当然,问题在于我实际上不知道高度应该是多少,因为它们根据内容而变化。

有没有一种好的策略来管理高度可变的视图数组?另外,我认为需要补充一点,这些垂直视图的总高度可能会大于包含它们的视图控制器视图的高度。最终我想通过UIScrollView滚动它们,但现在它们可以继续超出屏幕。

3个回答

3
每个UIView都有一个-(CGSize)intrinsicContentSize方法。如果你的视图内容会动态变化,你需要重写这个方法并根据视图内容返回适当的尺寸。自动布局使用这些信息来计算视图的高度。你可能需要调用-(void)invalidateIntrinsicContentSize来让系统知道内在大小已经改变。顺便说一下,大多数由苹果提供的UIKIT类已经提供了适当的内在大小。

我认为intrinsicContentSize可能与此有关,但是我该如何计算视图呢?它不应该根据其子视图及其约束自动计算吗? - Sethypie
如果您正在创建自定义视图,则需要一些帮助。如果您能更多地说明这些自定义视图的类型,那将会很有帮助。 - Maarten
我在容器视图中递归调用了所有子视图的intrinsicSize,结果发现高度实际上是使容器视图变得如此巨大的原因。为什么会计算出不正确的内在内容大小呢?这些子视图都只是UILabel、UIButtons和UIImages。 - Sethypie
在查看每个视图的大小后,我注意到我的UIImageView使用的内在大小是它们所持有的基本图像的大小,而不是我放置在它们上面的约束(实际图像为64x64,但约束为32x32)。 - Sethypie
也许是因为父视图的内在内容大小是在子视图的内在大小之前计算的。可能在那时,子视图还没有正确地报告它们的大小。或许您可以在稍后的时刻使父视图的内在大小失效。 - Maarten
显示剩余2条评论

0

我认为没有办法在不设置视图的特定高度的情况下完成这个任务。您可以为每个视图创建IBOutlets,并根据内容大小在代码中修改其常量参数。我猜另一种可能有效的方法是在IB中给它们任意大小,然后在添加任何子视图后调用sizeThatFits。


0

我不知道FLKAutoLayout是什么,但我曾经尝试过类似的情况,并且成功了。

如图所示,view1、view2、view3以线性布局方式相互链接。

现在,您应该手动为每个视图设置高度约束。同时,确保最后一个视图也与superView设置了垂直空间约束。

现在,诀窍是为superView设置手动高度约束,并将其优先级设置为低于所有其他约束的值。例如,如果您将其他约束的优先级设置为1000,则将此超级视图的约束设置为999。

现在,当您在view1、view2、view3中呈现内容时,通过它们各自的高度约束(通过更改其常量值)相应地更改它们的高度。您会发现,子视图现在会自动调整位置,而父视图也会自动调整其高度。

现在,要为滚动视图解决问题,您只需要更新contentSize。由于通过约束更改高度不会立即显示实际高度,因此您需要在以下回调中更新滚动视图:-viewDidLayoutSubViews

希望这对您的情况有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接