增加内容大小时如何防止内容偏移

Posted

技术标签:

【中文标题】增加内容大小时如何防止内容偏移【英文标题】:How to prevent content offsetting when increasing content size 【发布时间】:2017-04-08 06:12:53 【问题描述】:

tl;dr我不希望在UIScrollView's 内容窗口顶部上方增加UIViews 的大小以将其下方的内容向下推。

我有一个UIScrollView,它显示了许多UIStackViews 的列表,UIStackViews 的好处之一是当您将isHidden = false 设置为它的一个子视图时,它会自动调整大小以补偿新的查看。

现在,每个列表项都有一个UIStackViews,用户可以按下一个按钮,将isHidden = false 设置为每个列表项中的子视图,一次性。这意味着,每个列表项将增加一个等于未隐藏视图高度的量(每个堆栈视图的高度相同)。

如果滚动视图的contentOffset 为零,则没有问题,因为所有高度的增加只会将所有其余内容向下推,并且在所有视图都具有之后,用户仍将位于滚动视图的顶部未隐藏。

问题是当用户不在滚动视图的顶部时。在这种情况下,用户按下取消隐藏所有视图的按钮,高度的增加会将所有视图向下推,呈现向上滚动的外观。用户在列表中向下滚动的越多,其上方的视图越多,用户按下按钮时内容的变化就越大。

我正在寻找的行为与用户在滚动到视图顶部但在任何滚动位置时按下按钮时的行为相同。换句话说:无论用户在哪里滚动,当他们按下按钮时,唯一被按下的视图是滚动视图内容窗口顶部下方的视图。

知道如何做到这一点吗?

【问题讨论】:

【参考方案1】:

好的,让我看看我是否正确理解了你的问题。

这是滚动视图的状态

 A
 B
 C
 D
 E

当用户按下“全部展开”按钮时,它看起来像这样:

 A
 -1
 -2
 -3
 B
 -1
 +-a
 +-b
 -2
 C
 -1
 -2
 -3
 D
 -1
 -2
 E
 -1
 -2
 -3
 -4

问题是如果用户当前正在看

+---+
|D  |
|E  |
+---+

(列表中的第 4 和第 5 项) 他们最终会在扩展列表中看到:

+---+
|B  |
|-1 |
+---+

但他们应该会看到他们之前正在查看的项目 D

我可能会建议使用UITableView,因为您可以存储当前可见的 TableViewCells,然后随着视图动画,滚动到当前单元格(这应该使其相对保持在视图中)。

在您的情况下,我建议使用UIScrollView 捕获当前可见的子视图(使用当前的contentOffset/Size 和子视图的框架),然后在视图动画后确定它们的位置它的大小转换,然后滚动到新的位置。

正如我所提到的,这是一项更适合 UITableViewUICollectionView 的任务,其中父对象由操作系统跟踪和缓存,并且有管理行/单元格的插入/删除的特定规则。

HtH

【讨论】:

完全正确。然而,这一切都发生在一个 for 循环中,因此在每次迭代中,一个新视图将被取消隐藏。这意味着在每次迭代中我都必须滚动到新位置,除非我能以某种方式保证这一切都发生在同一个布局过程中,对吗?如果它不是全部发生在同一个布局通道中,我怎么能保证用户在每次滚动到新位置时都不会看到滚动视图自行纠正。我希望从用户的角度来看没有发生滚动的证据。

以上是关于增加内容大小时如何防止内容偏移的主要内容,如果未能解决你的问题,请参考以下文章

当父级可调整大小时,如何防止嵌套 DIV 的内容溢出父级?

当父可调整大小时,如何防止嵌套DIV的内容溢出父级?

如何使用响应大小的图像防止卡顿并减少布局偏移?

如何防止警告:POST Content-Length 和内存大小

如何防止警告:POST Content-Length 和内存大小

在缩小弹出框的内容大小时防止伪影