2010-11-29 7 views
8

Ich versuche, eine "Highlight" -Funktion in einem NSTextView zu schreiben. Momentan läuft alles super. Sie wählen einen Textbereich aus und die Hintergrundfarbe dieses Textes wird gelb. Solange der Hintergrund ausgewählt ist, ist der Hintergrund jedoch das Standardblau des ausgewählten Texts. Wie kann ich erreichen, dass die Standard-Auswahlindikatorfarbe in bestimmten Fällen nicht angezeigt wird?Ändern der Textauswahlfarbe in NSTextView

Danke!

Antwort

16

Verwenden Sie -[NSTextView setSelectedTextAttributes:...].

Zum Beispiel:

[textView setSelectedTextAttributes: 
    [NSDictionary dictionaryWithObjectsAndKeys: 
     [NSColor blackColor], NSBackgroundColorAttributeName, 
     [NSColor whiteColor], NSForegroundColorAttributeName, 
     nil]]; 

Sie können einfach ein leeres Wörterbuch übergeben, wenn Sie die Auswahl in irgendeiner Weise überhaupt nicht angezeigt werden sollen (kurz die Einfügemarke versteckt).

Eine andere Option ist, nach Auswahländerungen zu sehen und die "Auswahl" unter Verwendung von temporary attributes anzuwenden. Beachten Sie, dass temporäre Attribute verwendet werden, um Rechtschreib- und Grammatikfehler anzuzeigen und Ergebnisse zu finden. Wenn Sie also diese Features von NSTextView beibehalten möchten, sollten Sie nur temporäre Attribute hinzufügen und entfernen und nicht ersetzen.

Ein Beispiel hierfür ist (in einer NSTextView Unterklasse):

- (void)setSelectedRanges:(NSArray *)ranges affinity:(NSSelectionAffinity)affinity stillSelecting:(BOOL)stillSelectingFlag; 
{ 
    NSArray *oldRanges = [self selectedRanges]; 
    for (NSValue *v in oldRanges) { 
     NSRange oldRange = [v rangeValue]; 
     if (oldRange.length > 0) 
      [[self layoutManager] removeTemporaryAttribute:NSBackgroundColorAttributeName forCharacterRange:oldRange]; 
    } 

    for (NSValue *v in ranges) { 
     NSRange range = [v rangeValue]; 
     if (range.length > 0) 
      [[self layoutManager] addTemporaryAttributes:[NSDictionary dictionaryWithObject:[NSColor blueColor] forKey:NSBackgroundColorAttributeName] 
             forCharacterRange:range]; 
    } 

    [super setSelectedRanges:ranges affinity:affinity stillSelecting:stillSelectingFlag]; 
} 
+0

Durch die Hintergrundfarbe zu Clear Einstellung, das Highlight funktioniert erst, nachdem die gesamte Auswahl abgeschlossen ist. Wie kann ich diese Attribute anwenden, während die Auswahl läuft? – DexterW

+0

Benachrichtigungen werden erst ausgegeben, wenn die Maustaste losgelassen wird (d. H., Sie sind nicht länger 'stillSelecting'). Wenn Sie mit Auswahlen arbeiten möchten, müssen Sie eine Unterklasse von NSTextView erstellen (meine Antwort wurde bearbeitet, um Beispielcode zu erhalten). –