优化 UITableViewCell 上的绘图

Posted

技术标签:

【中文标题】优化 UITableViewCell 上的绘图【英文标题】:Optimizing drawing on UITableViewCell 【发布时间】:2010-04-02 18:23:42 【问题描述】:

我正在向 UITableViewCell 绘制内容,它运行良好,但我正在尝试了解是否有更好的方法。

每个单元格都有以下组件:

左侧的缩略图 - 可能来自服务器,因此它是异步加载的 标题字符串 - 可变长度,因此每个单元格的高度可能不同 时间戳字符串 渐变背景 - 渐变从单元格顶部到底部,并且是半透明的,因此背景颜色具有光泽

目前运行良好。绘图发生如下:

UITableViewController 初始化/重用一个单元格,设置所需的数据,并调用

[单元集NeedsDisplay]

单元格有一个用于缩略图的 CALayer - thumbnailLayer

在单元格的drawRect中绘制渐变背景和两个字符串

单元格的 drawRect 然后调用 setIcon - 它获取缩略图并将图像设置为 thumbnailLayer 的内容。如果本地没有找到图片,则将加载图片设置为 thumbnailLayer 的内容,并异步获取缩略图。收到缩略图后,通过再次调用 setIcon 将其重置并重置 thumbnailLayer.contents

目前这一切都有效,但使用仪器我看到缩略图正在与渐变合成。我尝试了以下方法来解决这个问题:

将单元格的 backgroundView 设置为一个视图,其 drawRect 将绘制渐变,以便单元格的 drawRect 可以绘制缩略图,使用 setNeedsDisplayInRect 将允许我仅在加载后重绘缩略图 --- 但这导致backgroundView 的绘图(渐变)覆盖单元格的绘图(文本)。

我只会在单元格的 drawRect 中绘制缩略图,但是当调用 setNeedsDisplay 时,drawRect 只会与另一个图像重叠,并且加载的图像可能会显示出来。我会清除矩形,但我必须重新绘制渐变。

我会尝试在 CAGradientLayer 中绘制渐变并存储对它的引用,以便快速重绘它,但我想如果单元格的高度发生变化,我必须重新绘制渐变。

有什么想法吗?我确定我遗漏了一些东西,所以任何帮助都会很棒。

Bump - 有人对此有什么想法吗?

【问题讨论】:

【参考方案1】:

UIView 和 CALayer 都有 opaque 属性。只要您可以将其设置为 YES,就不会进行合成,并且绘图会更快。如果您的缩略图没有透明度,则它是理想的候选对象。

【讨论】:

【参考方案2】:

我开始使用 setNeedsDisplayInRect。我仍然在 drawRect 中绘制所有内容,但是当我这样做时,我会检查需要绘制的矩形并仅更新该矩形。我还使用 CGLayers 进行绘制并将它们保留为 ivars。当我需要重绘一个没有改变的部分时,我使用存储的 CGLayer。缩略图不再是 CALayer。对于绘图选择,我将不得不使用 selectedBackgroundView 并重用我的 CGLayers。

【讨论】:

以上是关于优化 UITableViewCell 上的绘图的主要内容,如果未能解决你的问题,请参考以下文章

Xcode UI 测试:UITableViewCell 上的辅助功能查询失败

在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView

UITableViewCell 上的 UIProgressView

绘图 + UITableViewCell + UIScrollView 子类?

为子类 UITableViewCell 上的披露按钮设置目标

ios 7 uitableviewcell 绘图更改