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