2011-02-18 16 views
5

Sto provando a sottoclasse NSCell per disegnare un'evidenziazione di sfondo personalizzata. La documentazione sembra suggerire che l'override di highlight:withFrame:inView: dovrebbe consentirmi di farlo, ma il metodo non viene mai chiamato.Evidenziatore personalizzato NSCell

Invece, ho sostituito drawInteriorWithFrame:inView: che funziona correttamente: posso disegnare quello che voglio nella cella. Tuttavia, il problema è che devo disegnare tutto da solo, perdendo la funzionalità del tipo di NSCell I rivolgo - per esempio la capacità di un NSTextFieldCell per visualizzare il testo:

disegnato su misura evidenziata cella:

enter image description here

Tuttavia, voglio solo per ridisegnare lo sfondo (il momento clou), e mantenere la capacità di utilizzare la funzionalità principale della cella estesa:

enter image description here

Potrei, ovviamente, disegnare il testo anch'io, ma spero che ci sia un modo più semplice per farlo.

Qualsiasi aiuto è molto apprezzato.

+2

Si sta inviando '[super drawInteriorWithFrame: cellFrame inView: controlView];' (con qualsiasi nome di parametro che si sta utilizzando) dopo aver disegnato lo sfondo personalizzato? –

+0

@Bavarious: se lo faccio, lo sfondo personalizzato viene perso. Il risultato è lo stesso del secondo screenshot, poiché presumo che anche il metodo faccia lo stesso sfondo. – JoeR

+2

Ah, gotcha. Non puoi impostare un colore di evidenziazione trasparente in modo che 'super' non interferisca con l'evidenziazione personalizzata, e quindi usi' -isHighlighted' all'interno di '-drawInterior ...' per decidere come disegnare lo sfondo? –

risposta

10

Grazie all'aiuto di @Bavarious sono riuscito a risolverlo. La mia implementazione della classe NSTextFieldCell estesa contiene ora:

-(NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { 
    return nil; 
} 

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { 
    if ([self isHighlighted]) { 
     // Draw highlight background here 
    } 

    [super drawInteriorWithFrame:cellFrame inView:controlView]; 
} 

La chiave è quello di assicurarsi ritorni nil per highlightColorWithFrame:inView: per fermare drawInteriorWithFrame:inView: disegnare uno sfondo e ancora chiamandolo per disegnare il contenuto principale (in questo caso il testo).

+0

In che modo ** esattamente ** si disegna lo sfondo? Posso solo cambiare il colore del testo. Ho usato ... '\t se ([auto isHighlighted]) { \t \t \t \t NSColor * oldColor = [auto backgroundColor]; \t \t [self setBackgroundColor: [NSColor whiteColor]]; \t \t [super drawWithFrame: cellFrame inView: controlView]; \t \t [self setBackgroundColor: oldColor]; \t \t \t} ma non succede nulla! Grazie ... – Vassilis

+1

risolto: dovremmo usare: '[self setDrawsBackground: YES]' first – Vassilis

+0

Avete effettivamente sovrascritto '-drawInteriorWithFrame: inView:' invece di '-drawWithFrame: inView:'? – UncleAli