1

我有一个自定义 UITableViewCell 子类,它显示图像和文本。在显示表格视图单元格时,当文本随时可用时下载图像。

不同的地方,我读到最好只有一个视图并在视图的 drawRect 方法中绘制东西,以提高性能,而不是有多个子视图(在这种情况下是一个 UIImageView 视图和 2 个 UILabel 视图)

我不想在自定义表格视图单元格中绘制图像,drawRect因为

  1. 该图像在第一次调用时可能不可用,
  2. 我不想每次有人调用 drawRect 时都绘制整个图像。

仅当有人要求显示图像时才应在视图中显示图像(例如,当网络操作完成并且图像可以渲染时)。然而,文本是在 -drawRect方法中绘制的。

问题:

  1. 下载后,我无法在屏幕上显示图像。我目前使用的代码是-

    - (void)drawImageInView
    {
    //.. completion block after downloading from network
      if (image) { // Image downloaded from the network
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
        CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
        CGContextSetLineWidth(context, 1.0);
        CGContextSetTextDrawingMode(context, kCGTextFill);
    
        CGPoint posOnScreen = self.center;
        CGContextDrawImage(context, CGRectMake(posOnScreen.x - image.size.width/2,
                                           posOnScreen.y - image.size.height/2,
                                           image.size.width,
                                           image.size.height),
                                           image .CGImage);
        UIGraphicsEndImageContext();
      }
    }
    

我也试过:

        UIGraphicsBeginImageContext(rect.size);
        [image drawInRect:rect];
        UIGraphicsEndImageContext();

无济于事。

  1. 如何确保在呈现图像时将文本绘制在图像的顶部。是否应该调用[self setNeedsDisplay]afterUIGraphicsEndImageContext();足以确保文本呈现在图像之上?
4

2 回答 2

0

请注意,您链接到的 stackoverflow 页面已有将近四年的历史,而该问题链接到的文章已有近五年的历史。当这些文章写于 2008 年时,当前的设备是 iPhone 3G,它比 2013 年的当前设备慢得多(CPU 和 GPU 都慢)并且 RAM 也少得多。所以你在那里读到的建议不一定适用于今天.

无论如何,在您测量它(可能是使用 Time Profiler 仪器)并发现问题之前,不要担心性能。只需以最简单、最可维护的方式实现您的接口。然后,如果您发现问题,请尝试更复杂的方法来解决它。

所以:只需使用 aUIImageView来显示您的图像,并使用 aUILabel来显示您的文本。然后测试一下是不是太慢了。

如果您的测试表明它太慢,请对其进行分析。如果你不知道如何分析它,或者如何解释分析器输出,或者如何解决问题,那么回来发布一个问题,并包括分析器输出。

于 2013-06-21T03:02:31.127 回答
0

你是对的,因为没有 UILabel 对象开销,所以绘制文本会使你的应用程序更快,但是 UIImageViews 是高度优化的,你可能永远无法比这个类更快地绘制图像。因此,我强烈建议您使用 UIImageViews 来绘制图像。不要陷入优化陷阱:只有在您发现应用程序没有达到最佳性能时才进行优化。

下载图片后,只需将 imageView 的 image 属性设置为您的图片即可。

于 2013-06-20T08:44:10.113 回答