iOS Autolayout具有未知高度

时间:2013-07-11 18:03:26

标签: ios autolayout

我正在设置我的观点如下

layout http://i40.tinypic.com/2eulm4z.png

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

现在,您应该手动为每个视图设置高度约束。此外,请确保最后一个视图还具有使用superView设置的垂直空间约束。

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

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

现在,要为scrollview进行锻炼,您只需要更新contentSize即可。因为,通过约束更改高度,不会立即显示实际高度,您在以下回调中更新了滚动视图 -viewDidLayoutSubViews

我希望你的场景中有这种锻炼