如何将滚动视图与动态高度的子视图一起使用?

How to use scrollview with subviews of a dynamic height?

我在滚动视图中有一个标签,它可以少至 1 行,也可以多至 10 行。我无法弄清楚如何使 scrollview 内容大小动态,以便它会相应地伸展。

我尝试添加 >= 100(任意数字)的高度限制,但随后它抱怨它是 Inequality Constraint Ambiguity

如果您没有为 UILabel 指定高度限制,它将采用适合整个文本的高度。只需确保行数设置为 0 并且您的标签已设置所有边距限制。

快答

  1. 删除标签上的当前高度限制。
  2. 确保标签 Lines 属性 设置为 0 并且 Line Breaks 设置为 Word Wrap.
  3. 为标签上方和下方的视图添加垂直间距约束。
  4. 确保每个视图都有从上到下边距的垂直间距约束,以便滚动视图推断其 contentView.
  5. 的高度

说明

为了让滚动视图推断出它的内容大小,它必须有从边距到子视图再到边距的约束 - 想象它像一个气球,内容是里面的空气,它推动墙壁使气球达到它的大小是。从子视图到边距的约束允许子视图的大小将内容视图的墙推开。

对于标签,将 Lines 属性 设置为 0 意味着它将具有您想要的可变行数。 Line Breaks 属性 设置为 Word Wrap 意味着它将确保单词不会被截断(截断)或分解为字符,而是作为整个单词推到下一行。

Apple 的这篇技术说明解释了如何仅使用自动布局正确配置具有可滚动内容的滚动视图 https://developer.apple.com/library/ios/technotes/tn2154/_index.html

从概念上讲,在您的情况下,这就是您需要做的:

查看层次结构:

MainView -> ScrollView -> ContentView -> UILabel

  1. 滚动视图被限制在主视图的所有边缘,
  2. ContentView 被限制在 ScrollView 的所有边缘
  3. 并且 UILabel 被约束到 ContentView 的所有边缘(将 UILabel 行数设置为 0 并删除您当前应用的高度约束)

这里的关键是要认识到 contentView 的大小仅取决于 UILabel 的大小,因此 UILabel 高度会拉伸,contentView 也会拉伸。这将允许 scrollView 自动推断 contentSize 并在需要时启用滚动。