drawRect没有在我的UIImageView子类中调用

时间:2010-04-10 03:40:28

标签: iphone objective-c cocoa-touch uikit

我已经将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上设置了一个断点,它永远不会命中,导致我认为它永远不会被调用。是不是应该在视图首次加载时调用?我是否错误地覆盖了它?

4 个答案:

答案 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引用。