Отображение NSMutableAttributedString на iOS 8
Кажется, что iOS 8.0 (12A365) NSMutableAttributedString
иногда отображается неправильно. Проблема, очевидно, возникает, когда диапазон атрибута не начинается в начале текста (и если нет другого атрибута, начинающегося с начала текста).
Итак, с 1.) второе слово "green" in не будет отображать зеленый фон (ошибка!) ( "ячейка" - это UITableViewCell
с UILabel
"меткой" как подвью):
1).
text = [[NSMutableAttributedString alloc] initWithString:@"Green is green. (-> Bug)"];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){9,5}];
cell.label.attributedText=text
С 2.) и 3.) фон отображается правильно:
2.)
text = [[NSMutableAttributedString alloc] initWithString:@"Green is green. (-> Ok)"];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){0,5}];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){9,5}];
cell.label.attributedText=text
3).
text = [[NSMutableAttributedString alloc] initWithString:@"Green is green. (-> Ok)"];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){0,5}];
cell.label.attributedText=text
Найдите скриншот и проект XCode 6 здесь: Скриншот и проект XCode 6
Кажется, я ошибся в iOS 8 - поэтому отчет отправляется в Apple.
Ответы
Ответ 1
Попробуйте это, сначала примените дополнительное NSBackgroundColorAttributeName во всей метке с прозрачным цветом
text = [[NSMutableAttributedString alloc] initWithString:@"Green is green. (-> Bug)"];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor clearColor] range:(NSRange){0,text.length}]; //Fix
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){9,5}];
cell.label.attributedText=text
Ответ 2
Я сталкиваюсь с аналогичными проблемами с NSAttributedString и атрибутом NSLinkAttributeName в iOS 8. В частности, то, что начинается в начале строки (например, "www.cnn.com" ), отображается как ожидалось (с использованием drawWithRect: options: контекст:). Однако, если мы добавим ссылку за пределами первого символа (например, "текст www.cnn.com" ), ссылка не будет отображаться как синяя или подчеркнутая, несмотря на правильность атрибутов. Эти строки обычно имеют атрибуты, которые охватывают всю строку, и это, похоже, не имеет значения, возможно, потому что атрибуты "целая строка" добавляются после атрибутов NSLink. Я попытался заменить порядок, поэтому ссылки добавляются после других атрибутов, но это не устраняет проблему.
Единственным обходным решением, которое я догадался до сих пор, является повторная атрибуция ссылок с подчеркиванием после добавления атрибутов, которые применяются ко всей строке, например:
[_attributedDisplayValue enumerateAttribute:NSLinkAttributeName
inRange:displayValueRange
options:0
usingBlock:^(id value, NSRange range, BOOL *stop) {
[_attributedDisplayValue addAttribute:NSUnderlineColorAttributeName
value:[UIColor blueColor]
range:range];
}];
Ответ 3
Это уже не проблема (iOS 9.0) - скриншот