【问题标题】:UIScrollview contentOffset changes when removed from windowUIScrollview contentOffset 从窗口中移除时发生变化
【发布时间】:2012-11-23 15:22:19
【问题描述】:

我有一个关于 UIScrollView 的奇怪错误。此视图工作正常,直到我将其从窗口中删除(间接地,它是已删除视图的子视图)。

然后我执行一些不相关的动画;当我把视图放在原来的位置时,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 ...

当滚动视图将其自己的 contentOffset 从调用 _adjustContentOffsetIfNecessary (例如在 setFrame 之后)更改时,我看到了其他问题。 然而它在这里似乎没有任何意义,因为它的大小没有改变:它只是从屏幕上取下来(稍后放回)。所以它没有理由改变它的偏移量。

对此有什么解释吗?有什么方法可以防止这种变化?

我可以手动阻止(或恢复)偏移更改,但是我正在寻找一个“干净”的解决方案(如果可用):它是从窗口中删除的一整组视图。有时这个特定的滚动视图存在于视图树中,通常不会。所以动画类不应该知道滚动视图。

有什么想法吗?

提前致谢

【问题讨论】:

    标签: iphone ios cocoa-touch uiscrollview uikit


    【解决方案1】:

    有点骇人听闻,但您可以在 setContentOffset: 中进行测试,如果它已从其超级视图中删除,则只需返回。

    【讨论】:

    • 有点老套,但似乎是当前上下文中最干净的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2014-08-07
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多