没有为UIImageView调用drawRect

时间:2012-02-22 23:49:34

标签: iphone objective-c ios ipad

我的IB中有一个UIImageView,我用一个方法drawRect创建了一个UIImageView的子类:

@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。知道为什么吗?

2 个答案:

答案 0 :(得分:23)

UIImageView在子类化时不会调用drawRect

来自documentation

  

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

您只需将普通UIImageView替换为UIView,然后在UIView的{​​{1}}方法或子图层中绘制图像和自定义绘图。< / p>

答案 1 :(得分:0)

除了sch的答案之外,值得注意的是UIImageView如何以不同的方式用于UIView。

使用ImageView的方法是更改​​其.image属性。这意味着图像缓存在视图堆栈上。如果图像每帧都改变,那么这并不会给你太多。但如果没有,那就是一个相当大的改进。在大多数游戏/应用程序中,大多数对象不会每帧都改变。

您可以通过调用基础CALayer来更改UIView的位置,旋转和不透明度。这只是转换矩阵的一个变化,因此几乎没有时间损失。

我强烈建议任何不熟悉此参数的制作实时2D图形的人都会阅读https://developer.apple.com/library/ios/qa/qa1708/_index.html,这样可以更好地解释参数并提供示例代码。这样做非常简单。

将您的游戏对象包装在UIImageView中的想法似乎违反直觉,因为您不会将游戏逻辑与表示级别分开,这会将它们绑定在一起。然而,根据Apple的推荐,我刚刚修改了我的游戏原型,我的帧速率提高了一倍,所以我非常愿意牺牲我的建筑纯度。