drawRect 使 UIScrollView 中的滚动变慢

Posted

技术标签:

【中文标题】drawRect 使 UIScrollView 中的滚动变慢【英文标题】:drawRect makes scrolling slow in UIScrollView 【发布时间】:2011-05-16 12:19:40 【问题描述】:

我有一个 UIScrollView,里面有一个(自定义)UIView。

在我调用的 scrollViewDidScroll 方法中

[myCustomView setNeedsDisplay];

如果我在自定义 UIView 中实现 drawRect: 方法,这会使滚动明显变慢 - 即使它完全是空的。

我一删除drawRect:方法,就又流畅了。

我完全不知道,为什么……你们中的任何人?

【问题讨论】:

【参考方案1】:

我也讨厌drawrect

“这是因为硬件加速动画在 Cocoa 中的工作方式。

如果您没有自定义 drawRect 方法,系统会将您的视图的像素缓存在显存中。当它需要重绘它们时,它只是将像素点到屏幕上。

如果您有自定义的 drawRect 方法,则系统必须调用您的 drawRect 方法来渲染主内存中的像素,然后将这些像素复制到视频内存中,然后在每一帧中将像素绘制到屏幕上。文档说如果可以的话要避免 drawRect。

我认为主内存和显存在大多数/所有 ios 设备上都是共享的,但是当您为视图实现 drawRect 方法时,系统还有很多工作要做。

使用 OpenGL 层并通过 OpenGL 调用渲染到该层可能会更好,因为 OpenGL 直接与显示硬件对话。"

链接到该报价:http://www.iphonedevsdk.com/forum/iphone-sdk-development/80637-drawrect-makes-scrolling-slow-uiscrollview.html

【讨论】:

无论如何,我认为drawRect: 是在UITableViewCell 等控件中使用的完美方式,你觉得呢? 是的,当然!在 UITableViewCell 的 contentView 中绘制时,视图本身不会像在 UIScrollView 中那样刷新。

以上是关于drawRect 使 UIScrollView 中的滚动变慢的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 中的 drawRect 方法

UIScrollView中的drawRect裁剪

UIScrollView 中的 UIView 子类如何处理内存

绘图 + UITableViewCell + UIScrollView 子类?

为啥程序背景会减慢 UIScrollView?

使用drawRect延迟加载UIView:绘图