从窗口中移除后,UIScrollView的contentOffset会发生变化

5

我遇到了一个关于UIScrollView的奇怪bug。这个视图一直运行良好,直到我将其从窗口中移除(间接地,它是被移除的视图的子视图)。

然后我执行了一些无关的动画;当我把视图放回原来的位置时,scrollView的contentOffset已经改变了。

我在setContentOffset:函数中设置了断点,并得到了以下堆栈:

#0  -[TestScrollView setContentOffset:] (self=0x915fbd0, _cmd=0x7fb34cd, contentOffset={x = 80, y = -0}) at /Users/../TestScrollView.m:19
#1  0x008670ea in -[UIScrollView(Static) _adjustContentOffsetIfNecessary] ()
#2  0x0085db55 in -[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:dealloc:pin:] ()
#3  0x0084e6ff in -[UIScrollView _didMoveFromWindow:toWindow:] ()
#4  0x008444bb in -[UIView(Internal) _didMoveFromWindow:toWindow:] ()
#5  0x008444bb in -[UIView(Internal) _didMoveFromWindow:toWindow:] ()
#6  0x008444bb in -[UIView(Internal) _didMoveFromWindow:toWindow:] ()
#7  0x008444bb in -[UIView(Internal) _didMoveFromWindow:toWindow:] ()
#8  0x00840c72 in -[UIView(Hierarchy) _postMovedFromSuperview:] ()
#9  0x0083f4c6 in __UIViewWasRemovedFromSuperview ()
#10 0x0083f141 in -[UIView(Hierarchy) removeFromSuperview] ()
#11 0x00166573 in __98+[App MyAnimationLaunchingMethod]_block_invoke_0 ...

当滚动视图通过调用_adjustContentOffsetIfNecessary更改自己的contentOffset时,我看到了其他问题,例如在设置框架后。然而,在这里似乎没有任何意义,因为其大小并未改变:它只是从屏幕上取下来(稍后放回)。因此,它没有改变其偏移量的理由。
有什么解释吗?有什么方法可以防止这种变化吗?
我可以手动阻止(或恢复)偏移量的变化,但是如果有“清洁”的解决方案可用,则我正在寻找:这是一组完整的视图,它们从窗口中删除。有时,该特定滚动视图存在于视图树中,通常不在其中。因此,动画类不应了解滚动视图。
有什么想法吗?
提前感谢您。
1个回答

4

这有点像是一个技巧,但你可以在setContentOffset:中放置一个测试,如果它已从其父视图中删除,则简单地返回。


有点取巧,但在目前的情况下似乎是最清晰的解决方案。谢谢! - Eino Gourdin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接