2013-09-22 52 views
12

Tôi đang cố hiển thị độc đáo các đoạn được đánh dấu trong một NSTextView. Ngay bây giờ, tôi đang làm điều này bằng cách tạo ra một NSAttributedString với một màu nền. Dưới đây là một số mã được đơn giản hóa:Điểm nổi bật/màu nền NSAttributedString hiển thị giữa các dòng (xấu xí)

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

Phương pháp này về cơ bản hoạt động, ở chỗ nó tạo văn bản được đánh dấu.

Single line single spaced

Thật không may, khi nhiều dòng tồn tại, nổi bật bao gồm các không gian dọc giữa các đường ngoài các dòng họ, kết quả là xấu xa.

Multi line double spaced text

Có ai biết cách làm kiểu đánh dấu này trong ca cao không? Các hình ảnh dưới đây về cơ bản là những gì tôi đang tìm kiếm (bỏ qua cái bóng trên các hộp màu trắng):

whiteout text

Tôi muốn được sẵn sàng để sử dụng CoreText, html, hoặc bất cứ điều gì là cần thiết để làm cho mọi việc trông đẹp hơn .

+2

Đã bao giờ bạn giải quyết vấn đề này, tôi có chính xác cùng một vấn đề – user499846

+1

Tôi đã không tìm ra điều này, nhưng tôi đã tìm ra cách ít nhất là trung tâm vùng chọn xung quanh văn bản, để nó không phải ở trên hoặc phía dưới. Nó liên quan đến việc tính toán '[paragraphStyle setLineSpacing: xx]' và '[paragraphStyle setLineHeightMultiple: xx]' sao cho chúng giống nhau. Một lần nữa, điều này không giải quyết vấn đề thực tế mặc dù, chỉ làm cho nó dễ chịu hơn. – stevel

Trả lời

0

Hãy thử điều này: -

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

Thật không may trong trường hợp này, các dòng không được phân tách bằng \ n ký tự - đây là một đoạn văn, do đó văn bản được tự động bao bọc. Cảm ơn cho những nỗ lực, mặc dù. – stevel

+0

Tôi đã sửa đổi mã. Hãy thử ngay bây giờ và nó cũng sẽ không bao bọc các từ. –

2

Bạn sẽ cần phải phân lớp NSLayoutManager và ghi đè:

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

Đây là phương pháp thô sơ để vẽ hình chữ nhật màu nền.

+1

Cách bạn triển khai phương thức, supra, sẽ cụ thể cho ứng dụng của bạn. Nhưng, như bối cảnh bổ sung, tôi đã sử dụng '- (void) enumerateLineFragmentsForGlyphRange: (NSRange) glyphRange usingBlock: (void (^) (CGRect rect, CGRect usedRect, NSTextContainer * textContainer, NSRange glyphRange, BOOL * stop)) block' để tạo một mảng các cấu trúc CGRect mô tả các giới hạn được sử dụng bởi các ký tự glyph và tạo các giao lộ với nội dung rectArray để hạn chế các giới hạn của các điểm nổi bật của tôi. – nzeltzer