【问题标题】:drawRect not called in subclass of AsyncImageView在 AsyncImageView 的子类中未调用 drawRect
【发布时间】:2014-01-31 19:23:27
【问题描述】:

在我的项目中,我需要使用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,并将图像视图的IBOutlets更改为RoundedAsyncImageView。现在的问题是 drawRect 没有被调用。任何想法为什么?

编辑: 我读到UIImageView 子类不调用drawRect,我应该简单地在常规UIView 子类中绘制图像。问题是,我实际上不能这样做,因为我需要AsyncImageView 的异步加载图像功能。有没有办法做到这一点?

【问题讨论】:

    标签: ios uiimageview drawrect rounded-corners


    【解决方案1】:

    UIImageView 上的DrawRect 方法与UIView 略有不同

    视图仍然有一个 CALayer,但该层没有分配后备存储。相反,它使用 CGImageRef 作为其内容,渲染服务器会将图像的位绘制到帧缓冲区中。

    在这种情况下,没有进行绘图。我们只是将位图数据以图像的形式传递给 UIImageView。

    参考这篇文章Getting Pixels onto the Screen,根据我的经验,这就是为什么你不能让你的 imageView 剪辑方法工作。

    这是我的解决方案:

    1. 不要创建AsyncImageView 的子类,而是创建UIView 的子类。
    2. 添加AsyncImageView,这意味着您的子类成为AsyncImageView的包装视图。
    3. 在drawRect中实现clip方法,让asyncImageView处理它的内容变化。

    【讨论】:

    • 就像我说的,我不想使用cornerRadius,因为它对表视图的性能(即滚动)有不利影响。因此,如果我将您的解决方案与 drawRect 一起使用,我该怎么做呢?这意味着在 UIView 子类中我需要一个 drawRect 方法来以某种方式更改 AsyncImageView,对吧?
    • drawRect 方法不会改变 asyncImageView,这个视图的唯一目的是裁剪你的 imageView。在drawRect中实现clip方法,让asyncImageView处理它的内容变化。
    • 所以这个 UIView 将成为 AsyncImageView 的包装器,对吧?
    • 请扩展您的原始答案,以便我们将其标记为正确。
    • 我做了所有这些,图像不是圆形的,它们看起来是方形的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多