drawRect non viene chiamato nella sottoclass di UIImageView

Ho sottostimato UIImageView e ho provato a sovrascrivere drawRect in modo da poter disegnare sulla parte superiore dell’immagine utilizzando Quartz 2D. So che questa è una stupida domanda per principianti, ma non vedo cosa ho sbagliato. Ecco l’interfaccia:

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

E l’implementazione:

 #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 

Ho impostato un punto di interruzione su drawRect e non ha mai colpito, portandomi a pensare che non venga mai chiamato. Non dovrebbe essere chiamato quando la vista viene caricata per la prima volta? L’ho sovrascritto erroneamente?

Viene chiamato solo se la vista è visibile e sporca. Forse il problema è nel codice che crea la vista, o nel tuo pennino, se è così che lo stai creando?

Talvolta, i punti di interruzione non vengono impostati correttamente se si sta tentando di eseguire il debug di una build di “Rilascio”.


In qualche modo ho perso la prima volta che stai sottoclassi UIImageView. Dai documenti:

considerazioni speciali

La class UIImageView è ottimizzata per disegnare le sue immagini sul display. UIImageView non chiamerà drawRect: in una sottoclass. Se la sottoclass necessita di codice di disegno personalizzato, si consiglia di utilizzare UIView come class base.

Così il gioco è fatto. Dato quanto è facile disegnare un’immagine nella tua vista usando [UIImage drawInRect:], o usando CALayer, probabilmente non c’è un buon motivo per sottoclass UIImageView comunque.

Prova ad aggiungere

Modificare:

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

nel tuo codice.

spero che questo ti aiuti.

Grazie,

Madhup

Immagino che UIImageView non possa usare per sovrascrivere drawRect

Non rispondere direttamente alla tua domanda, ma potrebbe risolvere il tuo problema:

Perché farlo con una sottoclass di UIImageView? La sottoclass può sempre essere problematica, specialmente per le classi che non sono progettate per essere sottoclass – e scommetto che UIImageView non lo è. Se vuoi solo disegnare cose sopra un’immagine, quindi creare una vista con uno sfondo trasparente, disegnare quello che vuoi e posizionarlo direttamente sull’immagine.

A seconda del caso specifico, potrebbe avere senso utilizzare un UIButton con un’immagine di sfondo invece di UIImageView . È anche ansible impostare userInteractionEnabled su NO e il risultato sarebbe indistinguibile da UIImageView.

In questo caso la sottoclass UIButton includerebbe semplicemente:

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

Disclaimer: lo raccomanderei solo se hai intenzione di utilizzare l’immagine come pulsante almeno una volta. Non posso sostenere senza riserve un UIButton come soluzione per questo comportamento drawRect in UIImageView , poiché sono sicuro che Apple ha le sue ragioni per scrivere le API in questo modo, come Mark referenziato.