Цвет подчеркивания/цвета NSAttributedString показывает линии (уродливые)

Я пытаюсь хорошо отобразить абзацы, выделенные в NSTextView. Прямо сейчас, я делаю это, создавая 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

Кто-нибудь знает, как сделать этот вид подсветки в Cocoa? На картинке ниже в основном то, что я ищу (игнорируйте тень на белых ящиках):

whiteout text

Я бы хотел использовать CoreText, html или что-то еще, чтобы все выглядело лучше.

Ответ 1

Вам потребуется подкласс NSLayoutManager и переопределить:

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

Это примитивный метод рисования прямоугольников фона.

Ответ 2

Попробуйте следующее: -

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

        }
     }
}