drawRect不会在我的UIImageView的子类中被调用

我已经subclassed UIImageView,并试图重写drawRect,所以我可以使用Quartz 2D绘制图像的顶部。 我知道这是一个愚蠢的新手问题,但我没有看到我做错了什么。 界面如下:

#import <UIKit/UIKit.h> @interface UIImageViewCustom : UIImageView { } - (void)drawRect:(CGRect)rect; @end 

并执行:

 #import "UIImageViewCustom.h" @implementation UIImageViewCustom - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { } return self; } - (void)drawRect:(CGRect)rect { // do stuff } - (void)dealloc { [super dealloc]; } @end 

我在drawRect上设置了一个断点,它从来没有命中,导致我认为它永远不会被调用。 当视图第一次加载时不应该调用它吗? 我错误地重写了它吗?

只有在视图可见和脏的情况下才会被调用。 也许问题是在创build视图的代码中,或者在你的Nib中,如果这是你创build它的方式?

如果您尝试debugging“发布”版本,您有时也会看到断点无法正确设置。


我不知何故错过了第一次,你是inheritanceUIImageView。 从文档:

特别注意事项

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

所以你有它。 考虑到使用[UIImage drawInRect:]或通过使用CALayer将图像绘制到视图中是多么容易,无论如何,可能没有什么好理由inheritanceUIImageView。

尝试添加

编辑:

 - (id)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { [self setClearsContextBeforeDrawing:YES];//add this line also } return self; } - (void)setNeedsDisplay{ [self setNeedsDisplayInRect:self.frame]; } 

进入你的代码。

希望这可以帮助。

谢谢,

madhup

不直接回答你的问题,但可以解决你的问题:

为什么使用UIImageView的子类呢? 子类化总是有问题的,特别是对于没有被devise成子类的类 – 我敢打赌,UIImageView不是。 如果您只是想在图像上绘制东西,然后创build一个透明背景的视图,绘制任何你想要的,并将其直接放在图像上。

根据您的具体情况,使用带有背景图片的UIButton而不是UIImageView是有意义的。 您甚至可以将userInteractionEnabled设置为NO,并且结果与UIImageView无法区分。

在这种情况下,你的UIButton子类将包括:

 - (void)drawRect:(CGRect)rect { if (kSomethingSpecial) { [self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"] forState:UIControlStateNormal]; } } 

免责声明 – 我只会推荐这个,如果你有计划至less在某些时候使用图像作为button。 我不能全心全意地认可使用UIButton作为UIImageView这个drawRect行为的解决方法,因为我确信苹果有这样写他们的API的原因,比如Mark引用。

我想UIImageView不能用来覆盖drawRect