2011-02-18 5 views
5

J'essaie de sous-classer NSCell pour dessiner une surbrillance de fond personnalisée. La documentation semble suggérer que le highlight:withFrame:inView: déroutant devrait me permettre de faire ceci mais la méthode n'est jamais appelée.NSCell Custom Highlight

Au lieu de cela, j'ai remplacé drawInteriorWithFrame:inView: qui fonctionne bien - je peux dessiner ce que je veux dans la cellule. Cependant, la question est que je dois tirer tout moi-même, perdre la fonctionnalité du type de NSCell J'étends - par exemple la capacité d'un NSTextFieldCell pour afficher le texte:

personnalisé dessiné cellule mise en surbrillance:

enter image description here

Cependant, je veux juste redessiner l'arrière-plan (le point culminant), et de conserver la possibilité d'utiliser la fonctionnalité principale de la cellule étendue:

enter image description here

Je pourrais, bien sûr, simplement dessiner moi-même le texte, mais j'espère qu'il y a un moyen plus simple de le faire.

Toute aide est très appréciée.

+2

Envoyez-vous '[super drawInteriorWithFrame: cellFrame inView: controlView];' (avec les noms de paramètres que vous utilisez) après avoir dessiné votre arrière-plan personnalisé? –

+0

@Bavarious - Si je fais cela, l'arrière-plan personnalisé est perdu. Le résultat est le même que celui de la deuxième capture d'écran, car je suppose que cette méthode tire aussi son propre arrière-plan. – JoeR

+2

Ah, gotcha. Ne pouvez-vous pas définir une couleur de surbrillance transparente afin que 'super' ne dérange pas votre surbrillance personnalisée, et ensuite vous utilisez' -isHighlighted' dans '-drawInterior ...' pour décider comment dessiner l'arrière-plan? –

Répondre

10

Grâce à l'aide de @Bavarious, j'ai réussi à m'en sortir. Ma mise en œuvre de classe NSTextFieldCell étendue contient maintenant:

-(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 clé est de vous assurer que vous revenez nil pour highlightColorWithFrame:inView: arrêter drawInteriorWithFrame:inView: dessiner un fond et encore appeler encore pour dessiner le contenu principal (dans ce cas, le texte).

+0

Comment ** exactement ** dessiner l'arrière-plan? Je peux seulement changer la couleur du texte. Je l'ai utilisé ... '\t si ([auto isHighlighted]) { \t \t \t \t NSColor * oldColor = [self backgroundColor]; \t \t [self setBackgroundColor: [NSColor whiteColor]]; \t \t [super drawWithFrame: celluleFrame inView: controlView]; \t \t [self setBackgroundColor: oldColor]; \t \t \t} 'mais rien ne se passe! Merci ... – Vassilis

+1

résolu: Nous devrions utiliser: '[self setDrawsBackground: YES]' d'abord – Vassilis

+0

Avez-vous réellement surchargé '-drawInteriorWithFrame: inView:' plutôt que -drawWithFrame: inView: '? – UncleAli