Подтвердить что ты не робот

Отображение 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.

4b9b3361

Ответ 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];
                                         }];