滚动时在 UIScrollView 内更新 UITextView 会使 scrollView 停止滚动

Posted

技术标签:

【中文标题】滚动时在 UIScrollView 内更新 UITextView 会使 scrollView 停止滚动【英文标题】:Updating UITextView inside UIScrollView while scrolling makes the scrollView stop scrolling 【发布时间】:2012-04-20 06:07:17 【问题描述】:

我有一个 scrollView,其中包含 12 个设置为图块的 UIViews。每个 tile 都包含一个 textView。

scrollView 启用了分页。因此,您每页有 12 个图块,并且您可以水平滚动。

每当我收到来自 API 调用的信息时,我都会更新 textView。

这是正确更新 textView,但我有一个大问题。每当更新发生时,scrollView 实际上会滚动到刚刚更新的视图。因此,每当我加载一列新的图块时,滚动视图会在开始加载时停止,即使它有动量!

知道是什么原因造成的吗?

如果我在没有任何信息的情况下延迟加载单元格,一切正常,所以我认为这与我更新 textView 有关。

我已经试过了:

使用 NSTimer(并将其模式设置为 NSRunLoopCommonModes)。 使用 NSOperationQueue 并在我需要更新 UI 更改时调用主线程。

这些都不起作用。

【问题讨论】:

我的解决方案是将 UITextView 更改为 UILabel ,但什么也没发生。如果有人真的有答案,我会保持开放状态。 你是说改成 UILabel 解决了这个问题吗?尝试在更新时将 UITextView 可编辑属性更改为 NO,看看是否有帮助。确保在更新文本值时将 UITextView 上的委托设置为 nil。 【参考方案1】:

我认为解决方案在您的帖子中: “使用 NSOperationQueue 并在我需要更新 UI 更改时调用主线程。”

当 scrollView 调用 willScroll 时,停止当前正在下载的图像,当滚动视图停止滚动并调用其委托方法时,启动新队列以下载图像。

【讨论】:

我已经删除了 NSOperationQueue(现在一切都在主线程上),它仍然无法正常工作。【参考方案2】:

我的建议是使用仪器调试它。在 Instrument 中有一个名为“Time profiler”的跟踪模板,您可以实际看到您的应用程序在每个任务上花费了多少时间。 但是如果你正在更新 textViews,当然主线程会被阻塞,所以滚动视图会停止滚动,直到所有的 textViews 都被更新。所以我的建议是调整性能。 也许你在每个 textView 中加载了太多东西?

【讨论】:

我只是在更新 textViews 的 text 属性。不幸的是,我没有时间尽快回复,但我一定会用我最终找到的任何东西来更新这篇文章(正如我在上面的评论中说我已将其更改为 UILabel)。

以上是关于滚动时在 UIScrollView 内更新 UITextView 会使 scrollView 停止滚动的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 内更新 UIImageView - 滚动时图像冻结

以编程方式滚动时在 UIScrollView 上显示滚动指示器

UIScrollView 内 UIScrollView 内 UIScrollView

UIScrollView 通过在框架内拖动来滚动

关于在 UIScrollView 内滚动

UIScrollView 子视图中滚动事件的锁定处理(在 UIScrollView 超级视图内)