【问题标题】:UIScrollView containing multiple disabled UISwitch controls is lagging. Why?包含多个禁用的 UISwitch 控件的 UIScrollView 滞后。为什么?
【发布时间】:2014-07-28 17:30:45
【问题描述】:

在我的 iPad 应用程序中,我有一个 UIScrollView,其中包含一堆 UISwitch 元素。其中一组(大约 12 个)可以根据组状态启用/禁用。

当组状态为“启用”并且我将 UISwitch 启用属性设置为 YES 时,整个滚动视图会自然滚动。当我将 UISwitch enabled 属性设置为 NO 时,UIScrollView 在滚动时会滞后和卡顿。

我像这样启用/禁用十二个 UISwitch:

[self.switchOneOutlet setEnabled:NO];

[self.switchOneOutlet setEnabled:YES];

(当然,switchOneOutlet 对每个开关的命名都更具描述性。)

注意:我正在使用自动布局,但我已经测试过它是否有任何效果,但没有。这似乎与 UIScrollView 中的 UISwitch 元素的启用状态密切相关。我认为这不是自动布局问题。

当 UISwitches 被禁用时,有什么想法会导致这种卡顿吗?

【问题讨论】:

  • 您是否尝试过分析您的代码以查看 CPU 时间花费在哪里?没有更多信息,很难提供帮助。一个随机的问题:当开关被禁用时,您是否正在记录一些东西?
  • 没有任何记录。我可以在仪器中进行检查,尽管它看起来很简单,就像启用它们时视图滚动顺畅一样。当他们被禁用时,它会结结巴巴。我只在加载视图或点击按钮以禁用开关时检查状态。希望我能在仪器中看到这一点。
  • 我在 Time Profiler 中似乎看不到口吃。有什么随意的想法吗?

标签: ios uiscrollview lag uiswitch


【解决方案1】:

问题在于,当开关被禁用时,它们会应用一个 alpha 以使它们变灰。这会导致它们和它们的子视图在每一帧都被渲染到屏幕外。 (如果您使用 Core Animation 工具并选中“Color offscreen-rendered yellow”,则可以看到这一点;将启用与禁用进行比较。)这​​种离屏渲染(每帧)很昂贵,这也是您遇到性能问题的原因。

最简单的解决方案是让 Core Animation 在帧之间缓存开关的外观。 (由于它们的外观在滚动时不会改变,因此可以显着提高性能。)您可以这样做:

mySwitch.layer.shouldRasterize = YES;
mySwitch.layer.rasterizationScale = [[UIScreen mainScreen] scale];

请注意,此缓存仅在开关本身外观不变的情况下才能加快速度。在允许用户与这些开关交互之前,您可能希望将 shouldRasterize 设置为 NO。 (所以,也许当他们开始滚动时打开它,当他们停止时禁用它?你可能只需要玩弄这个来为你的情况做出正确的权衡。)

【讨论】:

  • 太棒了。我会试一试并报告!谢谢!
  • 是的。就是这样。谢谢!
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2018-10-05
相关资源
最近更新 更多