包含多个禁用的UISwitch控件的UIScrollView滞后。为什么?

时间:2014-06-07 15:43:48

标签: ios uiscrollview lag uiswitch

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

当群组状态为"启用时#34;并且我将启用UISwitch的属性设置为YES,整个scrollview自然滚动。当我将UISwitch启用属性设置为NO时,UIScrollView在滚动时滞后并且断断续续。

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

[self.switchOneOutlet setEnabled:NO];

[self.switchOneOutlet setEnabled:YES];

(当然,switchOneOutlet的描述更具描述性。)

注意:我正在使用自动布局,但我已经过测试,看它是否有任何效果,但它没有。这似乎严格依赖于UIScrollView中UISwitch元素的启用状态。我不相信这是一个自动布局问题。

当UISwitch被禁用时,有什么想法会导致这种口吃?

1 个答案:

答案 0 :(得分:1)

问题在于,当开关被禁用时,它们会应用alpha来将它们变灰。这会导致它们及其子视图在每个帧的屏幕外呈现。 (你可以看到这个,如果你使用核心动画工具并检查"彩色屏幕外渲染黄色&#34 ;;比较启用为禁用。)这种离屏渲染(每帧)是昂贵的,为什么你&#39 ;遇到性能问题。

最简单的解决方案是让Core Animation在帧之间缓存交换机的外观。 (由于它们的外观在滚动时不会改变,因此可以显着提高性能。)您可以通过以下方式执行此操作:

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

请注意,如果交换机本身的外观没有变化,这种缓存只能加快速度。在允许用户与这些交换机交互之前,您可能希望将shouldRasterize设置为NO。 (所以,也许在他们开始滚动时打开它,当它们停止时禁用它?你可能只需要玩这个来为你的情况获得正确的权衡。)