UIImageView的drawRect方法没有被调用

5

我在IB中有一个UIImageView,我创建了一个UIImageView的子类,其中包含一个名为drawRect:的方法。

@implementation UIImageViewLine

- (void)drawRect:(CGRect)rect
{
    NSLog(@"CALLED");
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 1.0f);
    CGContextMoveToPoint(context, 0, 0); 
    CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height);
    CGContextStrokePath(context);

}

@end

我已将UIImageView的类更改为此子类,但drawRect从未被调用。有任何想法为什么?

为什么要继承UIImageView而不是UIView? - Bryan Chen
那么我必须子类化一个UIView而不是UIImageView吗?如果我想在UIImageView上画一条线,该怎么办? - adit
你可以在UIImage上绘制图像,并使用UIImageView来显示图像。 - Bryan Chen
您可以为图像视图添加一个非透明的子视图,并使用该子视图来绘制线条。 - rob mayoff
2个回答

25

UIImageView在被子类化时不会调用drawRect方法。

根据文档

UIImageView类经过优化以将其图像绘制到显示器上。UIImageView不会调用其子类的drawRect:方法。如果您的子类需要自定义绘图代码,建议使用UIView作为基类。

您可以简单地将UIImageView替换为一个普通的UIView,并在UIViewdrawRect方法或子视图中绘制图像和自定义图形。


1
这就是为什么我喜欢 Stack Overflow,我想这刚刚节省了我半个小时。 - Ege Akpinar

0
除了sch的回答之外,值得注意的是UIImageView如何与UIView不同地使用。
ImageView的方法是更改其.image属性。这意味着图像被缓存在视图堆栈上。如果图像每帧都改变,那么这就没有太大作用。但如果它不改变,那么它是一个相当大的改进。在大多数游戏/应用程序中,大多数对象都不会每帧都改变。
您可以通过对基础CALayer的调用来更改UIView的位置,旋转和不透明度。这只是对变换矩阵的更改,因此几乎没有时间惩罚。
我强烈建议任何不熟悉此参数的实时2D图形制作者阅读https://developer.apple.com/library/ios/qa/qa1708/_index.html,该文档更好地解释了参数并提供了示例代码。它非常简单易懂。
将您的游戏对象包装在UIImageView中的想法似乎有些违反直觉,因为您希望将游戏逻辑与表现层分开,并将它们绑定在一起。然而,只要按照Apple的建议对我的游戏原型进行了修改,我就获得了双倍的帧速率,所以我非常愿意牺牲我的架构纯度。

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