UIScrollView - 为新的 contentSize 设置适当的 contentOffset 会产生不需要的空白空间

Posted

技术标签:

【中文标题】UIScrollView - 为新的 contentSize 设置适当的 contentOffset 会产生不需要的空白空间【英文标题】:UIScrollView - setting proper contentOffset for new contentSize yields undesirable empty space 【发布时间】:2011-10-04 13:16:28 【问题描述】:

我现在一直在玩 UIScrollView。我正在尝试根据各种因素将子视图插入到滚动视图中。因为我的滚动视图只能在垂直方向滚动,所以我会在当前可见视图之前或之后插入子视图。

所以,假设我当前可见视图的帧是 (0,0,320,480),scrollView 的 contentSize 是 (320,480),当前 contentOffset 是 (0,0)

当我想在 currentView 上方插入 subview 并保持 currentView 处于焦点时,我将新的 subview 插入位置 (0,-480,320,480) 并将 scrollView 的 contentSize 更改为 (320, 960),同时保持 contentOffset与 (0,0) 相同。

令人惊讶的是,UIScrollView 在 currentView 之后添加了“额外”空间,而不是在 currentView 上方插入它。虽然上面新插入的视图永远无法成为焦点,因为 UIScrollView 可能会从错误的 contentOffset 中假设 contentSize!

我google了一下,发现有一些others面临类似的问题,但还没有产生结果: Set starting point of content size for UIScrollView

如果我做错了什么,请告诉我?或者这是某种限制等?

谢谢!

编辑:一些threads 建议更改 contentSize 会影响 contentOffset 属性,因此为确保这不会导致问题,我仅在更改 contentSize 后更新 contentOffset 属性。即使那样我也面临同样的问题。

【问题讨论】:

【参考方案1】:

你可以通过以下方式解决这个问题:

使用框架 (0,0,320,480) 添加新的子视图 将现有子视图的框架设置为 (0,480,320,480) 将 contentSize 设置为 (320,960) 将内容偏移设置为 (0,480) - 当然不是动画。

因此,实际上,将所有内容向下移动 480 点

【讨论】:

【参考方案2】:

来源始终是(0,0)。如果您想在当前偏移量上方插入一些内容,您需要将当前视图向下移动480 points,在(0,0) 添加新视图并将 contentOffset 设置为(0,480)(并将 contentSize 设置为(320,960)

【讨论】:

hypercrypt & @AshleyMills - 我这样做会面临的问题是相应地改变下面的所有视图。我担心这也会导致 UI 出现故障,不是吗? 不,只要这一切都发生在运行循环的同一迭代中,它将不可见。

以上是关于UIScrollView - 为新的 contentSize 设置适当的 contentOffset 会产生不需要的空白空间的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 还是 UIImageView?

以编程方式在 UIScrollView 中居中子视图

pandas:将 int Series 转换为新的 StringDtype

每次为新的 API 调用创建新的繁琐连接?

将整数转换为新的浮点格式

您是不是必须为新的操作系统构建新的编译器?