我已经将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
上设置了一个断点,它永远不会命中,导致我认为它永远不会被调用。是不是应该在视图首次加载时调用?我是否错误地覆盖了它?
答案 0 :(得分:85)
只有在视图可见且脏的时候才会被调用。也许问题出现在创建视图的代码中,或者在你的Nib中,如果这就是你创建它的方式?
如果您正在尝试调试“发布”版本,您有时也会看到断点无法正确设置。
我不知何故错过了你第一次继承UIImageView。来自文档:
特别注意事项
UIImageView类已经过优化 将其图像绘制到显示器上。 UIImageView不会调用drawRect:in a 子类。如果您的子类需要 自定义绘图代码,建议使用 你使用UIView作为基类。
所以你有它。考虑到使用[UIImage drawInRect:]或使用CALayer将图像绘制到视图中是多么容易,无论如何都没有充分的理由继承UIImageView。
答案 1 :(得分:1)
尝试添加
修改强>
- (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
答案 2 :(得分:0)
不直接回答您的问题,但可以解决您的问题:
为什么要使用UIImageView的子类?子类化总是有问题的,特别是对于没有设计为子类的类 - 我敢打赌UIImageView不是。如果您只想在图像上绘制内容,则创建一个具有透明背景的视图,绘制您想要的任何内容,并将其直接放在图像上。
答案 3 :(得分:0)
根据您的具体情况,使用带有背景图片的UIButton
代替UIImageView
是有意义的。您甚至可以将userInteractionEnabled
设置为NO,结果将与UIImageView无法区分。
在这种情况下,您的UIButton
子类只包括:
- (void)drawRect:(CGRect)rect
{
if (kSomethingSpecial) {
[self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"]
forState:UIControlStateNormal];
}
}
免责声明 - 如果您计划至少在某些时候将图像用作按钮,我建议您这样做。我无法全心全意地使用UIButton
作为UIImageView
中此drawRect行为的解决方法,因为我确信Apple有这样的理由以这种方式编写API,例如Mark引用。