Изменение цвета выделения текста в NSTextView - PullRequest
11 голосов
/ 29 ноября 2010

Я пытаюсь написать функцию выделения в NSTextView. В настоящее время все отлично работает. Вы выбираете диапазон текста, и цвет фона этого текста меняется на желтый. Тем не менее, пока он все еще выбран, фон - это стандартный синий цвет выделенного текста. Как сделать так, чтобы стандартный цвет индикатора выбора не отображался в некоторых случаях?

Спасибо!

1 Ответ

20 голосов
/ 29 ноября 2010

Использование -[NSTextView setSelectedTextAttributes:...].

Например:

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

Вы можете просто пропустить пустой словарь, если вы вообще не хотите, чтобы выделение указывалось каким-либо образом (за исключением скрытия точки вставки).

Другой вариант - отслеживать изменения выбора и применять «выбор», используя временные атрибуты . Обратите внимание, что временные атрибуты используются, чтобы показать орфографические и грамматические ошибки и найти результаты; поэтому, если вы заботитесь о сохранении этих функций NSTextView, убедитесь, что только добавляете и удаляете временные атрибуты, а не заменяете их.

Примером этого является (в подклассе NSTextView):

- (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];
}
...