2013-09-22 169 views
12

我想很好地顯示在NSTextView突出顯示的段落。現在,我通過創建具有背景顏色的NSAttributedString來完成此操作。這裏有一些簡化的代碼:NSAttributedString突出顯示/背景顏色顯示行(醜)

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]; 

這種方法基本上起作用,因爲它產生突出顯示的文本。

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並重寫:

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

這是繪製背景色矩形的原始方法。

+1

你如何實現這個方法,將會特定於你的應用程序。但是,作爲附加的上下文,我用 ' - (void)enumerateLineFragmentsForGlyphRange:(NSRange)glyphRange usingBlock:(void(^)(CGRect rect,CGRect usedRect,NSTextContainer * textContainer,NSRange glyphRange,BOOL * stop))block' 創建一個CGRect結構數組,描述字符字形使用的邊界,並與rectArray內容創建交點來限制我的高光邊界。 – nzeltzer