2017-04-08 132 views
3

tl; dr我不想在UIScrollView's内容窗口的顶部上方增加UIViews的大小,以将内容向下推动。如何在增加内容大小时防止内容偏移

我有一个UIScrollView显示的许多UIStackViews列表,的UIStackViews的好处之一是,当你设置isHidden = false其子视图之一,它会自动调整以补偿新观点。现在

,每个项目都有这些UIStackViews之一,用户可以按下一个按钮,它将isHidden = false到子视图中的每一个,一下子。这意味着,每个列表项将增加一个等于未隐藏视图高度的量(每个堆栈视图的高度相同)。

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

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

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

任何想法如何做到这一点?

回答

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

+0

确切地说。然而,这一切都发生在for循环中,因此在每次迭代中,新视图都将被隐藏。这意味着在每次迭代中,我将不得不滚动到新的位置,除非我能以某种方式保证这一切发生在相同的布局传递中,对吗?如果它不全都发生在同一布局阶段,那么我如何保证用户在每次滚动到新位置时都看不到滚动视图。我希望从用户的角度来看,没有滚动的证据。 – shoe