drawRect não sendo chamado na minha subclass de UIImageView

Eu subclass o UIImageView e tentei anular o drawRect para que eu pudesse desenhar em cima da imagem usando o Quartz 2D. Eu sei que esta é uma pergunta idiota de novato, mas não estou vendo o que fiz de errado. Aqui está a interface:

#import  @interface UIImageViewCustom : UIImageView { } - (void)drawRect:(CGRect)rect; @end 

E a implementação:

 #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 

Eu defino um ponto de interrupção no drawRect e ele nunca acerta, levando-me a pensar que ele nunca é chamado. Não é suposto ser chamado quando a vista é carregada pela primeira vez? Eu incorretamente substitui isso?

Só será chamado se a visualização estiver visível e suja. Talvez o problema esteja no código que cria a visão, ou no seu bico, se é assim que você está criando?

Às vezes, você também verá pontos de interrupção não sendo definidos corretamente se estiver tentando depurar uma versão “Release”.


Eu de alguma forma perdi a primeira vez que você está subclassificando o UIImageView. Dos docs:

Considerações Especiais

A class UIImageView é otimizada para desenhar suas imagens no display. O UIImageView não chamará o drawRect: em uma subclass. Se sua subclass precisar de código de desenho personalizado, é recomendável usar o UIView como a class base.

Então você tem isso. Dado o quão fácil é desenhar uma imagem em sua visualização usando [UIImage drawInRect:], ou usando o CALayer, provavelmente não há uma boa razão para subclassificar o UIImageView de qualquer maneira.

Tente adicionar

Editar:

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

em seu código.

espero que isto ajude.

Obrigado,

madhup

Eu acho que o UIImageView não pode usar para replace o drawRect

Não responde diretamente à sua pergunta, mas pode resolver o seu problema:

Por que isso com uma subclass de UIImageView? A subsorting sempre pode ser problemática, especialmente para classs que não foram projetadas para serem subclassificadas – e aposto que o UIImageView não é. Se você quiser apenas desenhar coisas sobre uma imagem, crie uma vista com um fundo transparente, desenhe o que quiser e coloque-a diretamente sobre a imagem.

Dependendo do seu caso específico, pode fazer sentido usar um UIButton com uma imagem de fundo em vez de um UIImageView . Você pode até definir userInteractionEnabled como NO e o resultado seria indistinguível de um UIImageView.

Nesse caso, sua subclass UIButton includeia simplesmente:

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

Isenção de responsabilidade – Eu só recomendaria isso se você planeja usar a imagem como um botão pelo menos em parte do tempo. Eu não posso endossar sinceramente usando um UIButton como uma solução para este comportamento drawRect no UIImageView , como eu tenho certeza que a Apple tem suas razões para escrever sua API desta forma, como Mark referenciado.