在我的项目中,我需要使用AsyncImageView
加载图像。我也希望这些图像是圆形的。图像大部分出现在表格视图中,因此我不能在AsyncImageView's
层上使用圆角,因为这会对应用程序的性能产生非常非常不利的影响。
所以我决定要做的是创建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
的功能来异步加载图像。有什么办法吗? 最佳答案
DrawRect
上的UIImageView
方法与UIView
略有不同
该视图仍然具有CALayer,但是该图层未分配后备存储。相反,它使用CGImageRef作为其内容,并且渲染服务器会将图像的位绘制到帧缓冲区中。
在这种情况下,不会进行任何绘图。我们只是将图像形式的位图数据传递给UIImageView。
请参阅本文Getting Pixels onto the Screen,根据我的经验,这就是为什么无法使imageView clip方法起作用的原因。
这是我的解决方案:
代替创建AsyncImageView
的子类,而创建UIView
的子类。
添加AsyncImageView
,这意味着您的子类将成为AsyncImageView
的包装视图。
在drawRect中实现clip方法,并让asyncImageView处理其内容更改。