在我的项目中,我需要使用AsyncImageView
来加载图片。我也希望那些图像是圆形的。图像主要出现在表格视图中,因此我无法在AsyncImageView's
图层上使用roudned角落,因为这会对应用程序的性能产生非常非常不利的影响。
所以我决定创建一个AsyncImageView
的子类(因为我需要在我的项目中为其他视图创建原始的非圆形AsyncImageView),称为RoundedAsyncImageView
,我只在其中实现这样的drawRect
方法:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGPathRef clippath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:17].CGPath;
CGContextAddPath(ctx, clippath);
CGContextClip(ctx);
[self.image drawInRect:rect];
CGContextRestoreGState(ctx);
}
我有这个圆形图像应该出现的单元格的xib,用IB创建。所以我只是将UIImageView
元素的自定义类更改为RoundedAsyncImageView
,将图像视图的IBOutlet
更改为RoundedAsyncImageView
。现在的问题是drawRect
没有被调用。有什么想法吗?
编辑:
我读到UIImageView
子类不调用drawRect,我应该简单地在常规UIView
子类中绘制图像。问题是,我实际上无法做到这一点,因为我需要AsyncImageView
的功能来异步加载图像。有没有办法做到这一点?
答案 0 :(得分:1)
DrawRect
上的 UIImageView
方法与UIView
视图仍然有CALayer,但该图层不分配后备存储。相反,它使用CGImageRef作为其内容,渲染服务器将该图像的位绘制到帧缓冲区中。
在这种情况下,没有绘图。我们只是将图像形式的位图数据传递给UIImageView。
参考这篇文章Getting Pixels onto the Screen,根据我的经验,这就是为什么你无法使你的imageView剪辑方法有效。
这是我的解决方案:
AsyncImageView
的子类,而不是创建UIView
的子类。AsyncImageView
,这意味着您的子类成为AsyncImageView
的包装器视图。