获取显示视图中所有内容所需的高度

Posted

技术标签:

【中文标题】获取显示视图中所有内容所需的高度【英文标题】:Get the needed height to display all content within a View 【发布时间】:2018-12-06 19:11:06 【问题描述】:

我有一个自定义视图,它从具有多个子视图的 nib 加载。其中一些子视图包含可以是动态高度的标签。该视图最终作为子视图添加到滚动视图中的视图中。

想想ScrollView > View > SubView > Dynamic Labels

我正在使用自动布局约束,因此需要设置 SubView 的高度以显示其自身的所有内容,以便 ScrollView 滚动显示子视图中所有内容所需的长度。

我知道使用 UILabel,您可以执行 val neededLabelHeight = label.sizeThatFits(CGFloat(width: label.frame.height, height: CGFloat.greatestFiniteMagnitude)) 之类的操作来获得显示在单个标签上所需的高度,但是当我尝试在从 nib 加载的整个自定义视图上执行此操作时,它只有高度我的 nib 文件中的视图。

除了通过将所有需要的子视图高度和垂直约束相加来计算视图所需的高度之外,在具有更多子视图的视图上是否有类似的方法?

【问题讨论】:

如果您使用适当的约束,您将不需要对高度进行任何计算 - 这一切都由自动布局为您处理。请注意,如果您从 xib 加载“根视图”,自动布局会将该视图的 .translatesAutoresizingMaskIntoConstraints 设置为 true,因此您需要将其设置为 false(在代码中)以使其根据其内容自动调整大小. 不,不在滚动视图中。为了使scrollview 滚动正确的量,View 需要具有定义的高度。如果你没有为View 中的一个UILabel 设置高度约束,它会根据需要增长和缩小,并更新View's 定义的高度。但是,如果您使用 UIView 作为 View 内的子视图,则必须在该视图上设置高度约束,因为 UIView 不会像 UILabel 那样动态增长和收缩。 不...如果您正确设置约束,视图(其子视图)的内容将“推出”视图的框架。您确实不需要显式设置高度值。 对不起,你错了。去构建一个 ScrollView 并在其中堆叠一些没有高度限制的 UIView。它不起作用,您将被抛出 Missing Constraint 错误 缺少的约束是滚动视图内部视图的高度约束 【参考方案1】:

这是一个简单的例子……

XIB 文件如下所示:

注意:底部标签对视图底部的约束为>= 8。这样您就不必担心 IB 在设计过程中显示错误。底部的任何多余空间都会在运行时自动“消失”。

故事板如下所示:

滚动视图具有红色背景(以便于查看)。包含按钮的标签和视图按我们通常设置的方式进行布局和设置约束。

“蓝色”视图 - TheXIB Container View - 具有 120 的高度约束,但设置为将在运行时删除的占位符,允许从 XIB 加载的视图控制其高度。这将是我们添加来自 XIB 的 Labels Holder View 的视图。

这是使用少量文本时的外观:

无法滚动,因为内容不足。

点击“添加”按钮几次后,如下所示:

并且它可滚动的(我们可以在这张图片中看到它被向下滚动)。

对于喜欢使用“内容视图”作为滚动视图的“根”视图的人来说,它的工作原理是相同的(橙色视图是内容视图,每边插入 8 个点):

这里是这个示例项目的链接:https://github.com/DonMag/LoadXIBIntoScroll

下面是它的 gif 动画:

【讨论】:

试过了,但没用。当我展开和折叠子视图时,滚动视图的滚动长度不会改变 我已经像您一样正确设置了约束,但是您的项目并不能完全模拟我所拥有的。不过,我只需做一些计算就能让它工作

以上是关于获取显示视图中所有内容所需的高度的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout:如何将 UIView 限制为不高于包含其所有子视图所需的高度?

获取字符串 只定宽度内 所需的高度 方法二

仅从 CoreDate 或所有内容中获取所需的数据?

在首次显示之前获取屏幕高度?

SwiftUI - 计算 ScrollView 中长 GeometryReader 的高度

ios7 - boundingRectWithSize:boundingSize 不返回所需的标签高度