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

Ben*_*ins 42 iphone cocoa-touch objective-c uikit

我已经将UIImageView子类化并尝试覆盖drawRect,因此我可以使用Quartz 2D在图像上绘制.我知道这是一个愚蠢的新手问题,但我没有看到我做错了什么.这是界面:

#import <UIKit/UIKit.h>

@interface UIImageViewCustom : UIImageView {

}
- (void)drawRect:(CGRect)rect;
@end
Run Code Online (Sandbox Code Playgroud)

并实施:

#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
Run Code Online (Sandbox Code Playgroud)

我设置了一个断点drawRect并且它从未命中,导致我认为它根本不会被调用.是不是应该在视图首次加载时调用?我错误地覆盖了它吗?

Mar*_*sey 87

只有在视图可见且脏的时候才会被调用.也许问题出在创建视图的代码中,或者在你的Nib中,如果你正在创建它的话?

如果您正在尝试调试"发布"版本,您有时也会看到断点无法正确设置.


我不知何故错过了你第一次继承UIImageView.来自文档:

特别注意事项

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

所以你有它.考虑到使用[UIImage drawInRect:]或使用CALayer将图像绘制到视图中是多么容易,无论如何都没有充分的理由继承UIImageView.

  • 继续六年之后,用于UIImageView子类的Swift 3.0.1/Xcode 8.2.1模板仍然有样板注释掉draw(_ rect:CGRect)函数,其中注释表示如果你需要自定义绘图,只需取消注释添加自定义绘图代码.谢谢,stackoverflow社区! (3认同)