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

时间:2013-06-20 08:21:26

标签: ios core-graphics drawrect cgcontext

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

various places开始,我读到最好只有一个视图并在视图的drawRect方法中绘制东西,以提高性能,与拥​​有多个子视图(在本例中为UIImageView视图和2个UILabel视图)相比

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

  1. 图像可能在第一次被调用时无法使用,
  2. 每次有人调用drawRect时,我都不想绘制整个图像。
  3. 视图中的图像只应在有人要求显示图像时才会显示(例如,当网络操作完成且图像可供渲染时)。但是,文本是用 - 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();
        }
      }
      
    2. 我也尝试过:

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

      无济于事。

      1. 如何确保在渲染时在图像顶部绘制文本。在[self setNeedsDisplay]之后调用UIGraphicsEndImageContext();就足够了 确保文本呈现在图像的顶部?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

请注意,您链接到的stackoverflow页面已接近四年,该问题会链接到几乎五年岁的文章。当这些文章写于2008年时,目前的设备是iPhone 3G,速度要慢得多(CPU和GPU),并且RAM比2013年的当前设备少得多。所以你在那里阅读的建议今天不一定相关

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

所以:只需使用UIImageView显示图片,然后使用UILabel显示文字。然后测试看它是否太慢。

如果您的测试显示速度太慢,请对其进行分析。如果您无法弄清楚如何对其进行概要分析,或如何解释探查器输出,或如何解决问题,那么请回过头来发布问题,并包括探查器输出。