Ios 使用CoreGraphics在UIView中绘制图像,并在其上的drawRect外部绘制文本

Ios 使用CoreGraphics在UIView中绘制图像,并在其上的drawRect外部绘制文本,ios,core-graphics,drawrect,cgcontext,Ios,Core Graphics,Drawrect,Cgcontext,我有一个自定义的UITableViewCell子类,它显示和图像以及一个文本。 在显示表格视图单元格时,文本随时可用的情况下下载图像 从中,我了解到,与多个子视图(在本例中为一个UIImageView视图和两个UILabel视图)相比,在视图的drawRect方法中使用一个视图并绘制内容以提高性能更好 我不想在自定义表视图单元格的drawRect中绘制图像,因为 图像在第一次调用时可能不可用 我不想每次有人叫drawRect时都画出整个图像 只有当有人要求显示图像时(例如,当网络操作完成且图像可

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

从中,我了解到,与多个子视图(在本例中为一个UIImageView视图和两个UILabel视图)相比,在视图的drawRect方法中使用一个视图并绘制内容以提高性能更好

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

  • 图像在第一次调用时可能不可用
  • 我不想每次有人叫drawRect时都画出整个图像
  • 只有当有人要求显示图像时(例如,当网络操作完成且图像可供渲染时),才应在视图中显示图像。但是,文本是通过-
    drawRect
    方法绘制的

    问题是:

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

    - (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();
    
    无济于事

  • 如何确保在渲染图像时在图像顶部绘制文本。应在
    UIGraphicsEndImageContext()之后调用
    [self-setNeedsDisplay]
    足够 确保文本呈现在图像顶部

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


    下载图像后,只需将imageView的image属性设置为您的图像,即可完成操作。

    请注意,您链接到的stackoverflow页面已使用了近四年,而该问题链接到的文章已使用了近五年。在2008年撰写这些文章时,当前的设备是iphone3g,与2013年的当前设备相比,iphone3g速度要慢得多(包括CPU和GPU),内存也要少得多。所以你在那里读到的建议在今天并不一定有意义

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

    因此:只需使用
    UIImageView
    显示图像,使用
    UILabel
    显示文本即可。然后测试它是否太慢


    如果您的测试显示速度太慢,请对其进行评测。如果您不知道如何分析它,或者如何解释探查器输出,或者如何解决问题,请返回并发布一个问题,并包括探查器输出。

    使用UIImageView的问题是没有调用its-drawRect方法。因此,我必须在图像视图的顶部使用几个标签。如果不需要,我同意不优化,但我确实看到滚动中出现了一些中断,这就是为什么我尝试优化它。我不认为这是一个问题。在自定义单元格中,您可以将imageView用作独立的,然后覆盖(单元格的)drawRect来绘制文本。问题是(至少从我的实验来看)imageView位于superview的顶部,因此在显示图像视图时,在superview上执行的任何操作都会被隐藏,甚至是绘制文本。这很容易解决:如果你在单元格本身上绘制,你只需要计算出你想要绘制文本的正确矩形(你知道图像的大小是多少,不是吗?)。或者你也可以在单元格的contentView上画图。图像应该覆盖整个单元格边界,然后覆盖要显示的文本。我认为在内容视图中绘图的问题将是相同的,即imageView将解决它。这就是为什么我希望得到一个能够在图像上绘制文本的解决方案。