2013-09-22 26 views
12

Próbuję ładnie wyświetlić akapity podświetlone w NSTextView. Teraz robię to, tworząc NSAttributedString z kolorem tła. Oto uproszczony kod:NSAttributedString highlight/kolor tła pokazuje między wierszami (brzydki)

NSDictionary *attributes = @{NSBackgroundColorAttributeName:NSColor.greenColor}; 
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Here is a single line of text with single spacing" attributes:attributes]; 

[textView.textStorage setAttributedString:attrString]; 

To podejście zasadniczo działa, ponieważ tworzy wyróżniony tekst.

Single line single spaced

Niestety, gdy istnieje wiele linii, punktem kulminacyjnym obejmuje pionową przestrzeń między linie oprócz samych liniach, co skutkuje brzydotą.

Multi line double spaced text

Czy ktoś wie o sposób zrobić tego rodzaju podkreślając w kakao? Poniższy obraz jest w zasadzie to, co szukam (zignorować cień na białe pola):

whiteout text

byłbym skłonny do korzystania CoreText, HTML lub, co jest konieczne, aby wszystko wygląda ładniej .

+2

Czy kiedykolwiek rozwiązałeś to, mam dokładnie ten sam problem? – user499846

+1

Nie wymyśliłem tego tak naprawdę, ale wymyśliłem, jak przynajmniej wyśrodkować zaznaczenie rect wokół tekstu, tak aby nie było to wszystko powyżej lub poniżej. Polega na obliczeniu '[paragraphStyle setLineSpacing: xx]' i '[paragraphStyle setLineHeightMultiple: xx]' tak, aby były takie same. Ponownie, nie rozwiązuje to problemu, tylko sprawia, że ​​jest on bardziej znośny. – stevel

Odpowiedz

0

Spróbuj tego: -

 -(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

Niestety w tym przypadku wiersze nie są oddzielone znakami \ n - jest to akapit, więc tekst jest automatycznie zawijany. Dzięki za próbę. – stevel

+0

Zmodyfikowałem kod. Spróbuj teraz, a także nie rozwiąże słów. –

2

Musisz podklasy NSLayoutManager i zastąpić:

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

Jest to prymitywna metoda rysowania kolor tła prostokąty.

+1

Sposób wdrożenia metody, supra, będzie specyficzny dla twojej aplikacji. Ale, jako dodatkowy kontekst, użyłem '- (void) enumerateLineFragmentsForGlyphRange: (NSRange) glyphRange usingBlock: (void (^) (CGRect rect, CGRect usedRect, NSTextContainer * textContainer, NSRange glyphRange, BOOL * stop)) block' , aby utworzyć tablicę struktur CGRect, które opisują granice używane przez glify znaków, oraz utworzone skrzyżowania z zawartością rectArray w celu ograniczenia granic moich podświetleń. – nzeltzer