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.