Цвет подчеркивания/цвета 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];
}
}
}