【问题标题】:UIScrollView setContentOffset scrolls outside the content size and doesn't snap in backUIScrollView setContentOffset 滚动到内容大小之外并且不会向后对齐
【发布时间】:2016-05-27 23:00:07
【问题描述】:

我想滚动到UIScrollView 的顶部。你有两种可能:

  • setContentOffset()
  • scrollView.contentOffset

如果我使用动画,那么滚动视图有时会滚动到 (0, -26) 而不是 (0, 0)。所以它滚动得更远,但不会回到(0, 0)。这目前仅在 iPad 上发生。

如果我不使用动画,则每次都会按预期工作。有人知道这里出了什么问题吗?我在 iPad 2 iOS 8.4 模拟器上对此进行了测试

编辑:

在我打电话给setContentOffset() 之前,我有这个:

scrollView.layoutIfNeeded();
scrollView.setContentOffset(somePosition, true);

删除layoutIfNeeded 也可以解决问题。但为什么呢?

注意:我没有连续多次调用setContentOffset()。那是完全不同的任务!

【问题讨论】:

  • 您是否更改了其他内容,例如插图?和往常一样,发布基本的代码行可能会对您有所帮助。
  • 我不改变插图,只改变内容偏移量。在滚动之前我唯一要做的就是在滚动视图中添加一些新项目。通过设置内容偏移(仅此而已),代码行本身非常简单。但是在我复杂的项目中还有其他东西,似乎有这个效果。当我在按钮的帮助下滚动到顶部时(完全独立于我之前添加到滚动视图中的内容),这也与动画完美配合。所以也许这是一个时间问题。
  • 听起来确实是时间问题。布局需要时间。动画需要时间。那么当你说两者时会发生什么?说layoutIfNeeded 实际上并不是一件很常见的事情(在某些非常特殊的情况下它是正确的)。我想知道你为什么要这样做......我也模糊地想知道颠倒这两行的顺序是否会有所帮助。
  • @matt:我有这个是因为另一个问题。这里我很早就更改了内容偏移量(来自layoutSubviews)。没有这个,应用程序崩溃了。现在我正在检查我是否还需要这个。
  • @testing 你想让我把它作为建议添加到我的回答中吗?我并没有真正解决问题,只是向您展示我所做的事情,正如您正确推断的那样,似乎存在时间问题。 — 已添加。

标签: ios ipad uiscrollview animated contentoffset


【解决方案1】:

试试这个方法:

scrollView.layoutIfNeeded();
delay(0.05) {
    scrollView.setContentOffset(somePosition, true);
}

delay 在这里:dispatch_after - GCD in swift?

我的想法是,这可能会在我们继续之前给布局时间。

另一个想法可能是尝试颠倒这两行的顺序:

scrollView.setContentOffset(somePosition, true);
scrollView.layoutIfNeeded();

这里的想法是布局将在动画期间发生,并且我们知道布局是设计在动画期间工作的(这就是为什么在旋转期间布局更改是动画的原因)。

【讨论】:

  • 我尝试使用延迟,但这对我不起作用。颠倒顺序似乎是要走的路。还应该将layoutIfNeeded 放在layoutSubviews 中(但它应该只调用一次)。
猜你喜欢
  • 2012-10-07
  • 2019-11-23
  • 2014-02-11
  • 1970-01-01
  • 2023-03-12
  • 2011-11-02
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多