2012-02-22 72 views
4

我有一个UIImageView在我的IB和我创建的UIImageView的子类有一个方法的drawRect: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永远不会被调用。任何想法为什么?

+0

为什么子类的UIImageView不UIView的? – 2012-02-22 23:56:40

+0

舒服,所以我必须继承一个UIView而不是UIImageView的?如果我想在UIImageView上画一条线,该怎么办? – adit 2012-02-23 00:10:44

+0

你可以借鉴的UIImage并使用的UIImageView显示图像 – 2012-02-23 01:27:03

回答

20

UIImageView当子类别时不会调用drawRect

documentation

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

只需通过正常UIView更换UIImageView和绘制图像和自定义图纸在UIViewdrawRect方法或子层。

+1

这就是为什么我喜欢这样,我想这只是救了我一个半小时 – 2013-06-25 14:41:40

0

除了sch的答案,值得注意的是如何UIImageView可以不同地使用UIView。

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

您可以通过调用底层CALayer来更改UIView的位置,旋转和不透明度。这只是对变换矩阵的一种改变,因此几乎没有时间处罚。

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

将游戏对象包装在UIImageView中的想法似乎违反直觉,因为您不想将游戏逻辑与演示级别分开,并将它们绑定在一起。不过,根据苹果的建议刚刚改装成我的游戏原型,我得到双倍帧速率,所以我很愿意妥协我的建筑纯度。