2013-09-22 22 views
12

NSTextView'da vurgulanan paragrafları güzel bir şekilde görüntülemeye çalışıyorum. Şu anda, arka plan rengiyle NSAttributedString oluşturarak bunu yapıyorum.NSAttributedString vurgulama/arka plan rengi çizgiler arasında gösterilir (çirkin)

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

Bu yaklaşım temelde o vurgulanan metni üretir içinde, çalışır: İşte bazı basitleştirilmiş kod. birden fazla satır bulunduğunda

Single line single spaced

Ne yazık ki, vurgu ugliness sonuçlanan hatlar dışında ayrıca arasındaki çizgileri dikey alan kapsar.

Multi line double spaced text

kimse Cocoa vurgulayarak bu tür yapmak için bir yol biliyor mu?

whiteout text

Her şeyin daha güzel görünmesi için CoreText, html, ya da her neyse gereklidir kullanmak için istekli olurdu: Aşağıdaki resim ben (beyaz kutular üzerine gölge görmezden) aradığım şey temelde .

+2

Bunu çözdüğünüz oldu mu, ben de tam olarak aynı sorunu yaşıyorum – user499846

+1

Bunu gerçekten anlamadım, ancak seçim metninin etrafına en azından nasıl odaklanacağını anladım. altında. '[ParagraphStyle setLineSpacing: xx]' ve '[paragraphStyle setLineHeightMultiple: xx]' hesaplamaları ile aynıdır. Yine de, bu gerçek sorunu çözmek değil, sadece daha tolere edilebilir hale getirir. – stevel

cevap

0

bu deneyin: -

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

Maalesef bu durumda, satırlar \ n karakterleri ile ayrılmaz - bu bir paragraftır, bu nedenle metin otomatik olarak sarılır. Yine de teşebbüs için teşekkürler. – stevel

+0

Kodu değiştirdim. Lütfen şimdi deneyin ve aynı zamanda kelimeleri sarmalamayacaktır. –

2

Sen NSLayoutManager alt sınıfı ve geçersiz kılmak gerekir:

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

Bu arka plan rengi dikdörtgenler çizmek için ilkel yöntemdir.

+1

Bu yöntemi nasıl uygularsanız uygulamanıza özgüdür. (NSRange) glyphRange usingBlock: (boşluk (^) (CGRect yönüne bağlı CGRect usedRect, NSTextContainer * textContainer, NSRange glyphRange, BOOL * durdur)) block' (boşluk) enumerateLineFragmentsForGlyphRange - Ama, ek içerik olarak, ben 'kullanılan , karakter glifleri tarafından kullanılan sınırları tanımlayan bir CGRect yapısı dizisi oluşturmak ve vurgularımın sınırlarını kısıtlamak için rectArray içerikleriyle kesişimler oluşturdu. – nzeltzer