2010-04-10 17 views
38

Ho sottoclassi 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:drawRect non viene chiamato nella sottoclasse di UIImageView

#import <UIKit/UIKit.h> 

@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 è mai colpisce, mi porta a pensare che non viene mai chiamato a tutti. Non dovrebbe essere chiamato quando la vista viene caricata per la prima volta? L'ho sovrascritto erroneamente?

+0

si prega di consultare la risposta aggiornata, mi dispiace per infastidire di nuovo. –

+0

okies. esaminando la documentazione ho osservato che funzionerebbe se si crea una sottoclasse di UIView invece di UIIMageView, ora è possibile aggiungere le proprietà di UIImageView nella sottoclasse, l'ho fatto una sola volta per disegnare lo sfondo delle celle tableview, per maggiori dettagli è possibile check at.http: //stackoverflow.com/questions/1784827/draw-a-custom-cell-for-tableview-uitableview-with-changed-colors-and-separa –

risposta

80

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 si sottoclasse UIImageView. Dalla documentazione:

Considerazioni particolari

La classe UIImageView è ottimizzato per trarre le sue immagini al display. UIImageView non chiamerà drawRect: in una sottoclasse . Se la sottoclasse necessita del codice di disegno personalizzato , è consigliabile utilizzare UIView come classe base.

Quindi ce l'hai. Dato quanto è facile disegnare un'immagine nella tua vista usando [UIImage drawInRect:], o usando CALayer, probabilmente non c'è un buon motivo per sottoclasse UIImageView comunque.

+0

non dovrebbe drawRect get call quando la vista è prima reso, però? –

+0

In realtà, ora che me lo dici, mi ricordo di averlo letto. Non so perché non sono riuscito a trovarlo di nuovo quando lo stavo cercando. Grazie. –

+1

'UIImageView' è una grande cosa essere in grado di sottoclasse se si vuole lavorare con IB. Sigh ... grazie per la risposta, aiuta. –

0

Senza rispondere direttamente alla tua domanda, ma può risolvere il problema:

Perché fare questo con una sottoclasse di UIImageView? La sottoclasse può sempre essere problematica, specialmente per le classi che non sono progettate per essere sottoclasse - 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.

+1

OK, bene, l'ho cercato nella documentazione e apparentemente la sottoclasse va bene. Sospetto ancora che questo non sia il modo migliore per raggiungere l'obiettivo. – jasoncrawford

1

tenta di aggiungere

Edit:

- (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 codice.

spero che questo aiuti.

Grazie,

Madhup

+0

Grazie per il suggerimento, ma non ha funzionato neanche :-(L'aggiornamento –

+0

non ha funzionato. –

+0

clearsContextBeforeDrawing è YES di default! – daveoncode

-1

Credo che l'UIImageView non può utilizzare per sovrascrivere drawRect

0

A seconda del caso specifico, potrebbe avere senso utilizzare un UIButton un'immagine di sfondo con al posto di un UIImageView.Si potrebbe anche impostare userInteractionEnabled su NO e il risultato sarebbe indistinguibile da UIImageView.

In questo caso il vostro UIButton sottoclasse sarebbe semplicemente includere:

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

Disclaimer - vorrei solo raccomandare questo se avete intenzione di utilizzare l'immagine come un pulsante, almeno qualche volta. Non posso sostenere con tutto il cuore l'utilizzo di un UIButton come soluzione temporanea 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.

Problemi correlati