UIImageView和drawInRect有什么区别?

14

我想在表格单元格中显示很多图片。我知道两种方法可以展示一张图片。

其中一种是创建UIImageView的实例并显示它

CGRect rect=CGRectMake(x,y,width,height);
UIImageView *image=[[UIImageView alloc]initWithFrame:rect];
[image setImage:[UIImage imageNamed:@"sample.jpg"]];

另一种方法是:

CGRect rect=CGRectMake(x,y,width,height);
[[UIImage imageNamed:@"sample.jpg"] drawInRect:rect];

现在,我的问题是这两者之间有什么区别?哪一个更有效?或者是否有其他更好的函数可用?

提前感谢...

2个回答

32
利用drawInRect:方法,CoreGraphics会使用CPU将图像绘制到活动的CGContext中。假设您在一个UIViewdrawRect:方法中,这将把图像绘制到视图的缓冲区中。
相比使用较慢的drawRect:方法,UIImageView使用分配给它的任何图像作为其后备缓冲区。然后GPU通过QuartzCore直接引用此缓冲区,当屏幕通过QuartzCore合成时显示图像。

3
在需要平滑滚动且有透明度的PNG图片的情况下, -drawRect: 的优势就体现出来了。在旧硬件上,GPU 无法处理同时滚动大量透明视图而不掉帧的情况。绕过这个问题的一种方法是在 -drawRect: 中完成所有合成操作,这将把繁重的 GPU 工作转换成一次性的 CPU 工作。虽然在 iPhone 4 和 iPad 上由于更快的 GPU,这不再是一个很大的问题,但在图形密集的表格视图单元格中,这仍然是一个相对常见的场景。 - Nick Forge
Nick Forge:这提出了一个很好的观点。在可能的情况下将 UIView.opaque 设置为 YES - rpetrich
我也想知道它们的区别,但是因为一些术语不太清楚,比如“CGContext、cpu、gnu、view's buffer、backing buffer”,所以我并没有完全理解答案。有人能推荐一本书让我开始理解这些与图形相关的概念吗? - eugene
在Nick Forge的评论基础上,现在可以将视图层的shouldRasterize属性设置为YES,作为在CPU上绘制的替代方法。这具有类似缓存重负载工作的效果,并且在某些情况下可能比在CPU上绘制具有更好的性能。 - rpetrich
@rpetrich:不必特定于QuartzCore和iOS,一般概念也可以。但是,如果使用实际库更容易掌握概念,那么选择与iOS相关的实现会更好。感谢您的关注。 - eugene
显示剩余3条评论

0

UIImageViewUIView 的子类。将其添加到视图层次结构中,您将获得所有免费的好处:动画、大小属性、仿射变换等。此外,您可以随时更改底层的 UIImage

另一方面,调用 drawInRect: 只会在您指定的位置绘制图像,但不与 UIView 层次结构交互,因此您不会从将其放在视图层次结构中获得任何好处。

我认为(尚未尝试过),直接绘制图像会更快,但在大多数情况下,拥有一个 UIImageView 更好。


有趣的是,绘制图像比将其分配给“UIImageView”更慢,因为它不够直接。 - rpetrich
感谢您宝贵的回答。 - Rajkanth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接