我正在使用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
,这不是您想要的,而只是一个测试。在此之后应该滚动正常,否则我错了。