UIScrollView 的子视图应该如何报告它们的 contentSize 范围?

Posted

技术标签:

【中文标题】UIScrollView 的子视图应该如何报告它们的 contentSize 范围?【英文标题】:How should child views of UIScrollView report their bounds for contentSize? 【发布时间】:2010-05-23 21:05:30 【问题描述】:

我正在寻找更多关于正确设计视图的建议。

我拥有的是一个 UIScrollView,其中包含我创建的一个或多个自定义视图。我的问题是,谁向滚动视图报告它的 contentSize 应该是什么?我有以下内容:

UIView  
+-UIScrollView  
  +-CustomView 1 with dynamic height depending on data
  +-CustomView 2 with dynamic Height depending on data

UIViewController 使用数据创建自定义视图的新实例,然后将它们作为子视图添加到 UIScrollView。我遇到的问题是如何设置滚动视图的 contentSize 的值?现在,我没有这样做,并且滚动视图的内容被剪切,无法滚动。

自定义视图是否应在其 drawRect: 中调用 [父 setContentSize:]? UIViewController 是否应该在创建后查询自定义视图以获取其边界,然后调用 setContentSize? 我应该继承 UIScrollView 以覆盖 addSubView 来查询每个子视图的高度吗? 我还缺少什么吗?

我希望我正确地解释了这一点。我是新手,但我仍然掌握了一些东西。

【问题讨论】:

澄清一点以响应drawonward:我的自定义视图具有可变高度的文本和许多按行排列的图像。视图必须根据字体和内容计算文本的高度,并确定图像的行数。所有这些代码都在视图中。除非此代码在视图控制器中重复,否则视图控制器无法在滚动视图上设置 contentSize。 【参考方案1】:

滚动视图的 contentSize 应该是所有自定义视图的框架并集的大小。每当自定义视图的大小发生变化,或者添加或删除一个视图时,视图控制器都应该计算新的 contentSize 并应用它。

从 drawRect: 设置它基本上可以设置一个无限循环。 使用边界不会给出父视图内的坐标。 如果自定义视图不改变大小,您可以继承 UIScrollView。

【讨论】:

我想这是我困惑的一部分。为什么 ViewController 会知道视图的尺寸? (然后可以更新滚动视图)它应该知道尺寸吗?在我看来,视图是所有绘图的内容,因此它将是其尺寸的一个真正来源。我错了吗? 是的,每个自定义视图都是其自己尺寸的来源,并且应该通过 sizeThatFits: 报告理想尺寸,或者只是自己调整尺寸。但他们不需要知道同行的维度。一些更高级别的对象需要找到自定义视图的联合,并将它们布置在滚动视图中。这可能是视图控制器或自定义滚动视图。我会选择一个视图控制器,除非你有几个自定义滚动视图的实例。 所以基本上,自定义视图必须能够在drawRect之外计算它的高度?这似乎与表格视图和单元格内联。

以上是关于UIScrollView 的子视图应该如何报告它们的 contentSize 范围?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 内容大小在不应该时裁剪子视图

以编程方式将 UIScrollView 滚动到 Swift 中的子 UIView(子视图)的顶部

无法设置 UIView 的 backgroundColor,它是 Swift 中 UIScrollView 的子视图

如何使用 XIB 的子视图实现 UIScrollView

UIViews 是 UIScrollView 的子视图。如何跟踪子视图在定义的矩形内?

UIScrollView 如何将充当容器的子视图约束到所有其他视图?