UIScrollView - 如何在滚动之前摆脱延迟



我正在使用UIScrollView来显示自定义UIView。当用户drags手指划过UIScrollView时,在显示器开始更新之前会有明显的延迟。如果用户一直touching屏幕,UIScrollView会在短时间内变得非常敏感。随后的scroll尝试会导致相同的初始延迟,然后是高响应性。这种延迟严重影响了视图的可用性,我想摆脱它。

在我编写的一个测试项目中,试图深入了解这个问题,我只能部分复制该行为。用户第一次scrolls完全相同 - 但是任何后续的scroll尝试都会立即响应。

我已经尝试了设置delaysContentTouches = NO和子类化UIScrollView以便touchesShouldBegin returns NO在线多个地方的建议,但都没有奏效。

我在iOS 4.3上使用MonoTouch,但Objective-C答案都很好。我会发布代码来帮助说明这个问题,但由于我无法缩小问题范围,这将超过 1000 行。希望这是获得解决方案的足够信息。

有谁知道可能导致这种延迟的原因,以及我如何摆脱它?

提高滚动性能的一些一般建议。

让滚动视图在屏幕外栅格化:

myView.layer.shouldRasterize = YES;

为滚动视图上的每个子视图设置该属性 - 不要为这些子视图的子视图设置该属性,否则只会以这种方式占用内存。

如果滚动视图不需要合成,请确保关闭该混合:

myView.opaque = YES;

通过利用 iOS 模拟器的"调试"菜单上显示的以下两个功能来测试模拟器:

  • 屏幕外渲染的颜色
  • 颜色混合图层

如果这不能解决您的问题,并且您已经实现了 UIScrollViewDelegate,请仔细检查以确保您在这些方法中没有做任何耗时的事情 - 例如,根据您的描述,您可能正在 scrollViewDidScroll、scrollViewWillBeginDragging 或 scrollViewWillBeginZooming 中执行某些操作,如果是,请对其进行优化,以便在滚动开始之前发生。 另外,请确保您没有做任何接触开始的事情。

我怀疑正在发生的事情是滚动视图的内容中启用了某种交互。

系统不知道初始触摸是点击其中一个子视图还是拖动滚动视图,因此在等待查看您是否要抬起手指时会导致延迟。

UIScroll 视图的子视图是什么?

作为实验,将UIScrollView的所有子视图设置为具有userInteractionEnabled = NO,这不是您想要的,而只是一个测试。在此之后应该滚动正常,否则我错了。

最新更新