如何在增加内容大小时阻止内容抵消

时间:2017-04-08 06:12:53

标签: ios uiscrollview autolayout

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

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

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

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

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

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

知道怎么做到这一点吗?

1 个答案:

答案 0 :(得分:2)

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

这是滚动视图的状态

 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