在我的项目中,我需要使用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处理其内容更改。

10-08 03:15