在NSTextView中更改文本选择颜色

14

我正在尝试在NSTextView上编写“高亮”功能。目前,一切都很顺利。您选择一段文本范围后,该文本的背景色就会变为黄色。但是,在仍然选中的情况下,背景是所选文本的标准蓝色。我如何使特定情况下不显示标准选择指示器颜色?

谢谢!

1个回答

23

请使用-[NSTextView setSelectedTextAttributes:...]方法。

例如:

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

如果您不想以任何方式指示选择(除了隐藏插入点),则可以简单地传递一个空字典。
另一种选择是监视选择更改并使用临时属性应用“selection”。请注意,临时属性用于显示拼写和语法错误以及查找结果;因此,如果您关心保留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];
}

将背景颜色设置为clearColor后,高亮显示仅在整个选择完成后才起作用。我该如何在选择进行中应用这些属性? - Dexter
通知直到释放鼠标按钮(即不再“stillSelecting”)才会被传递。如果您想处理进行中的选择,则需要子类化NSTextView(编辑我的答案以提供一些示例代码)。 - Nicholas Riley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接