2010-11-29 7 views
8

NSTextView에 "강조 표시"기능을 쓰려고합니다. 현재 모든 것이 잘 작동합니다. 텍스트 범위를 선택하면 해당 텍스트의 배경색이 노란색으로 바뀝니다. 그러나 아직 선택되어있는 동안 배경은 선택한 텍스트의 표준 파란색입니다. 어떤 경우에는 표준 선택 표시기 색상이 나타나지 않게하려면 어떻게합니까?NSTextView에서 텍스트 선택 색상 변경

감사합니다.

답변

16

-[NSTextView setSelectedTextAttributes:...]을 사용하십시오. 예를 들어

: 당신이 (삽입 지점을 숨기는 짧은) 모두에 어떤 식 으로든 표시 선택을하지 않으려면

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

당신은 단순히 빈 사전을 전달할 수 있습니다.

또 다른 옵션은 선택 변경 사항을 확인하고 temporary attributes을 사용하여 '선택'을 적용하는 것입니다. 임시 속성은 철자 및 문법 오류를 표시하고 결과를 찾는 데 사용됩니다. 따라서 NSTextView의 이러한 기능을 보존하는 것이 중요하다면 임시 속성을 추가 및 제거하고 대체하지 말아야합니다.

이의 예 (A를 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]; 
} 
+0

clearColor에 배경 색상을 설정하여, 하이라이트는 전체 선택이 완료된 후에 만 ​​작동합니다. 선택이 진행되는 동안이 속성을 어떻게 적용 할 수 있습니까? – DexterW

+0

알림은 마우스 버튼을 놓을 때까지 전달되지 않습니다 (즉, 'stillSelecting'). 진행중인 선택을 처리하려면 NSTextView를 서브 클래스해야한다 (샘플 코드를 제공하기 위해 필자의 대답을 편집했다). –

관련 문제