Ios 使用CoreGraphics在UIView中绘制图像,并在其上的drawRect外部绘制文本
我有一个自定义的UITableViewCell子类,它显示和图像以及一个文本。 在显示表格视图单元格时,文本随时可用的情况下下载图像 从中,我了解到,与多个子视图(在本例中为一个UIImageView视图和两个UILabel视图)相比,在视图的drawRect方法中使用一个视图并绘制内容以提高性能更好 我不想在自定义表视图单元格的Ios 使用CoreGraphics在UIView中绘制图像,并在其上的drawRect外部绘制文本,ios,core-graphics,drawrect,cgcontext,Ios,Core Graphics,Drawrect,Cgcontext,我有一个自定义的UITableViewCell子类,它显示和图像以及一个文本。 在显示表格视图单元格时,文本随时可用的情况下下载图像 从中,我了解到,与多个子视图(在本例中为一个UIImageView视图和两个UILabel视图)相比,在视图的drawRect方法中使用一个视图并绘制内容以提高性能更好 我不想在自定义表视图单元格的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将解决它。这就是为什么我希望得到一个能够在图像上绘制文本的解决方案。