3

我正在尝试如下设置我的视图

布局

每个视图都包含许多子视图,例如标签和按钮。对于我的项目,我必须使用自动布局。具体来说,我正在使用一个名为 FLKAutolayout 的第三方库,它只是让事情变得更快。问题是这些视图中的每一个都有一个动态高度。可以将每个视图的两侧固定到父视图的每一侧。但是,当涉及到垂直排列时,我遇到了模棱两可的布局。我尝试将视图 1 固定到超级视图的顶部,将视图 2 的顶部固定到视图 1 的底部,将视图 3 的顶部固定到视图 2 的底部,依此类推。如果我不将最底部的视图固定到超级视图的底部,则不会显示任何内容。如果我确实将最底部的视图固定到超级视图的底部,则只有最顶部的视图会拉伸到屏幕的全尺寸。如果我手动将高度限制为任意数量,则一切正常。当然,问题在于我实际上并不知道高度应该是多少,因为它们会因内容而异。

是否有一个很好的策略来管理具有可变高度的视图数组?另外,我认为我需要补充一点,视图的总高度有可能(并且很可能)大于包含这些垂直视图的视图控制器视图的高度大小。最终,我希望能够使用 UIScrollView 滚动浏览它们,但现在它们可以在屏幕外继续。

4

3 回答 3

3

每个UIView人都有一个-(CGSize)intrinsicContentSize方法。如果您的视图内容动态变化,您应该重写该方法并根据视图的内容返回适当的尺寸。自动布局使用此信息来计算视图的高度。您可能必须打电话-(void)invalidateIntrinsicContentSize让系统知道内在大小已更改。顺便说一句:大多数 Apple 提供的 UIKIT 类已经提供了适当的内在大小。

于 2013-07-11T20:19:11.477 回答
0

我不知道 FLKAutoLayout。但我一直在尝试类似的情况并取得了成功。

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

现在,您应该手动为每个视图设置高度约束。另外,确保最后一个视图也具有与 superView 一起设置的垂直空间约束。

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

现在,当您在 view1、view2、view3 中渲染内容时,通过各自的高度约束(通过更改其常量值)相应地更改它们的高度。你会发现 subViews 现在会自动调整位置,superview 也会自己调整它的高度。

现在,要锻炼滚动视图,您只需要更新 contentSize。因为,通过约束改变高度,不会立即带出实际高度,您已经在以下回调 -viewDidLayoutSubViews 中更新了滚动视图

我希望在你的场景中锻炼

于 2013-07-15T20:28:31.297 回答
0

如果不为视图设置特定的高度,我认为没有任何方法可以做到这一点。您可以为它们中的每一个制作 IBOutlets,并根据内容大小在代码中修改它们的常量参数。我想另一种可能可行的方法是在 IB 中给它们任意大小,然后在添加任何子视图后对它们调用 sizeThatFits。

于 2013-07-11T18:40:29.953 回答