在UITableViewCell上优化绘图

时间:2010-04-02 18:23:42

标签: iphone cocoa-touch uitableview core-animation core-graphics

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

每个单元格都包含以下组件:

  • 左侧的缩略图 - 可能来自服务器,因此它已加载async
  • 标题字符串 - 可变长度,因此每个单元格可以是不同的高度
  • 时间戳字符串
  • 渐变背景 - 渐变从细胞顶部到底部,半透明,使背景颜色透过光泽

目前效果很好。绘图如下:

  • UITableViewController进入/重用单元格,设置所需数据和调用

    [cell setNeedsDisplay]

  • 该单元格有缩略图的CALayer - thumbnailLayer

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

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

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

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

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

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

有什么想法吗?我确定我错过了什么,所以任何帮助都会很棒。

颠簸 - 任何人对此都有任何想法?

2 个答案:

答案 0 :(得分:0)

UIView和CALayer都有一个不透明的属性。任何时候你可以设置为YES,将没有合成,绘图会更快。如果缩略图图像没有透明度,则它是理想的候选者。

答案 1 :(得分:0)

我开始使用setNeedsDisplayInRect。我仍然在drawRect中绘制所有内容,但是当我这样做时,我会检查需要绘制的rect,并且只更新那个rect。我也使用CGLayers绘制并将它们保存为ivars。当我需要重绘未更改的部分时,我使用存储的CGLayer。缩略图不再是CALayer。对于绘图选择,我将不得不使用selectedBackgroundView并重用我的CGLayers。