2013-09-22 2 views
12

NSTextView에서 강조 표시된 단락을 멋지게 표시하려고합니다. 바로 지금, 백그라운드 색상으로 NSAttributedString을 생성하여이 작업을 수행하고 있습니다. 다음은 간단한 코드입니다.NSAttributedString 행간 강조/배경색 표시 (추한)

이 접근법은 기본적으로 강조 표시된 텍스트를 생성합니다. 복수의 라인이 존재하는 경우

Single line single spaced

불행히도, 하이라이트 추 결과, 선 자체에 더하여 간의 경계를 수직 공간 커버.

Multi line double spaced text

사람은 코코아에 강조 표시의이 종류를 할 수있는 방법을 알고 있나요?

whiteout text

내가 일을 더 좋은 보이게 CoreText, HTML, 또는 어떤 필요를 사용 기꺼이 : 아래 그림은 내가 (흰색 상자에 그림자를 무시) 무엇을 찾고 있어요 기본적으로 .

+2

이 문제를 해결 한 적이 있습니까? 정확하게 동일한 문제가 있습니까? – user499846

+1

나는 이것을 실제로 파악하지 못했지만 텍스트 위에 선택 영역을 가운데에 배치하는 방법을 알아 냈습니다. 이하. 여기에는'[paragraphStyle setLineSpacing : xx]'와'[paragraphStyle setLineHeightMultiple : xx]'가 같은지 계산됩니다. 다시 말하지만 이것은 실제 문제를 해결하지 못한다. – stevel

답변

0

이 시도 : -

 -(IBAction)chooseOnlylines:(id)sender 
{ 

NSString *allTheText =[tv string]; 
    NSArray *lines = [allTheText componentsSeparatedByString:@"\n"]; 
    NSString *str=[[NSString alloc]init]; 
    NSMutableAttributedString *attr; 
    BOOL isNext=YES; 
    [tv setString:@""]; 
    for (str in lines) 
    { 
     attr=[[NSMutableAttributedString alloc]initWithString:str]; 
     if ([str length] > 0) 
     { 

     NSRange range=NSMakeRange(0, [str length]); 
     [attr addAttribute:NSBackgroundColorAttributeName value:[NSColor greenColor] range:range]; 
     [tv .textStorage appendAttributedString:attr]; 
      isNext=YES; 
     } 
     else 
     { 
      NSString *[email protected]"\n"; 
      NSAttributedString *attr=[[NSAttributedString alloc]initWithString:str]; 
      [tv .textStorage appendAttributedString:attr]; 
      isNext=NO; 
     } 
     if (isNext==YES) 
     { 
      NSString *[email protected]"\n"; 
      NSAttributedString *attr=[[NSAttributedString alloc]initWithString:str]; 
      [tv .textStorage appendAttributedString:attr]; 

     } 
    } 
} 
+0

불행히도이 경우 줄은 \ n 문자로 구분되지 않습니다. 단락이므로 텍스트가 자동으로 줄 바꿈됩니다. 그래도 고마워. – stevel

+0

코드를 수정했습니다. 지금 시도해보십시오. 또한 단어를 감싸지 않을 것입니다. –

2

당신은 NSLayoutManager를 서브 클래스 화해 오버라이드 (override) 할 필요가 있습니다 :

- (void)fillBackgroundRectArray:(const CGRect *)rectArray 
         count:(NSUInteger)rectCount 
      forCharacterRange:(NSRange)charRange 
         color:(UIColor *)color; 

이 배경 색 사각형을 그리기위한 원시적 인 방법이다.

+1

위 메서드를 구현하는 방법은 응용 프로그램에 따라 다릅니다. (CGRect rect, CGRect usedRect, NSTextContainer * textContainer, NSRange glyphRange, BOOL * stop)) 블록 ' '- (void) enumerateLineFragmentsForGlyphRange : (NSRange) glyphRange usingBlock : (void (^) 을 사용하여 문자 모양에 사용 된 경계를 설명하는 CGRect 구조체의 배열을 만들고 rectArray 내용과 교차 부분을 만들어 내 하이라이트 범위를 제한합니다. – nzeltzer