44 votes

Changer la couleur de sélection sur NSTableView basé sur la vue

La couleur de surbrillance standard dans les applications OS X est le bleu.

Est-il possible de le changer pour une autre couleur, par exemple le gris ?

Notez que j'utilise le nouveau NSTableView basé sur les vues disponible à partir d'OS X 10.7.

78voto

James Chen Points 4867

Puisque vous utilisez le NSTableView basé sur la vue, vous pouvez sous-classer NSTableRowView, le transmettre à la méthode de délégué de table - (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row; , puis personnaliser votre sélection dans la classe de vue de ligne.

Voici un exemple :

 - (void)drawSelectionInRect:(NSRect)dirtyRect {
    if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone) {
        NSRect selectionRect = NSInsetRect(self.bounds, 2.5, 2.5);
        [[NSColor colorWithCalibratedWhite:.65 alpha:1.0] setStroke];
        [[NSColor colorWithCalibratedWhite:.82 alpha:1.0] setFill];
        NSBezierPath *selectionPath = [NSBezierPath bezierPathWithRoundedRect:selectionRect xRadius:6 yRadius:6];
        [selectionPath fill];
        [selectionPath stroke];
    }
}

22voto

Felix Points 467

Voici la solution de James Chen dans Swift 3. J'ai également ajouté la méthode délégué.

 class MyNSTableRowView: NSTableRowView {

    override func drawSelection(in dirtyRect: NSRect) {
        if self.selectionHighlightStyle != .none {
            let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5)
            NSColor(calibratedWhite: 0.65, alpha: 1).setStroke()
            NSColor(calibratedWhite: 0.82, alpha: 1).setFill()
            let selectionPath = NSBezierPath.init(roundedRect: selectionRect, xRadius: 6, yRadius: 6)
            selectionPath.fill()
            selectionPath.stroke()
        }
    }
}

NSTableViewDélégué :

 func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
    return MyNSTableRowView()
}

15voto

Jean-Pierre Points 562

Utiliser le code suivant en réponse à la NSTableViewDelegate protocole tableViewSelectionDidChange :

Obtenez le NSTableRowView pour la ligne sélectionnée et appelez la méthode setEmphasized dessus. Lorsque setEmphasized est défini sur OUI, vous obtenez la surbrillance bleue, lorsque NON, vous obtenez la surbrillance grise.

 -(void)tableViewSelectionDidChange:(NSNotification *)aNotification {

     NSInteger selectedRow = [myTableView selectedRow];
     NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
     [myRowView setEmphasized:NO];
}

6voto

Utkarsha Points 250

Quelques modifications à la réponse de Jean-Pierre

Utilisez le code suivant en réponse au protocole NSTableViewDelegate tableViewSelectionDidChange :

Obtenez le NSTableRowView pour la ligne sélectionnée et appelez la méthode setEmphasized dessus. Lorsque setEmphasized est défini sur OUI, vous obtenez la surbrillance bleue, lorsque NON, vous obtenez la surbrillance grise.

 -(void)tableViewSelectionDidChange:(NSNotification *)aNotification {

 NSInteger selectedRow = [myTableView selectedRow];
 NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
[myRowView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleRegular];
[myRowView setEmphasized:NO];
}

Et pour éviter l'effet dansant de l'ensemble bleu puis gris

 [_tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];

3voto

AzzUrr1 Points 1291

Lorsque vous utilisez Swift, vous pouvez le faire sur 10.10 pour les cellules basées sur la vue

Sous-classez le NSTableCellView et implémentez ceci :

 //override to change background color on highlight
override var backgroundStyle:NSBackgroundStyle{
    //check value when the style was setted
    didSet{
        //if it is dark the cell is highlighted -> apply the app color to it
        if backgroundStyle == .Dark{
            self.layer!.backgroundColor = yourColor
        }
        //else go back to the standard color
        else{
            self.layer!.backgroundColor = NSColor.clearColor().CGColor
        }
    }
}

Notez que le NSTableView doit être défini sur Regular s'il est sur SourceList cela provoquera un écrêtage étrange.

Ce n'est pas la solution la plus propre mais elle fonctionne bien sur le yosemite

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X