Почему NSMutableAttributedString в некоторых случаях игнорирует атрибут цвета фона?

Я столкнулся с неприятной проблемой. Я хочу, чтобы метка отображала текстовую строку с частями строки, имеющими разные цвета фона.

Этот код работает:

let s = NSMutableAttributedString(string: "test me bar", attributes: [:])
s.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellowColor(),
   range: NSMakeRange(4, 2))
s.addAttribute(NSBackgroundColorAttributeName, value: UIColor.blueColor(), 
   range: NSMakeRange(8, 2))

self.detailDescriptionLabel.attributedText = s

введите здесь описание изображения

Но если я удалю только один из этих вызовов addAttribute (неважно какой), так что я укажу только один диапазон строки, чтобы иметь атрибут цвета фона, то цвет фона нигде в строке не отображается.

введите здесь описание изображения

У меня iOS 8.1, и это происходит в симуляторе и на моем iPhone 6. Я нашел эту проблему в своем коде и воспроизвел ее, используя только приведенный выше фрагмент в пустом проекте.

Любые идеи? Я рву на себе волосы. Это урезанная версия проблемы, но для моего проекта важно иметь строки, в которых только одна область имеет цвет фона.

РЕДАКТИРОВАНИЕ Если я установлю для одного из цветов фона значение UIColor.clearColor(), все будет работать как положено. Возможно, я смотрю на ошибку в UIKit?


person Bill    schedule 07.02.2015    source источник


Ответы (2)


Сначала вам нужно применить NSBackgroundColorAttributeName ко всему тексту прозрачным цветом.

[s addAttribute:NSBackgroundColorAttributeName value:[UIColor clearColor] range:(NSRange){0, s.length}];

Затем вы можете применить второй цвет к диапазону текста, который хотите выделить.

[s addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:(NSRange){0, 2}];

Для Swift:

mutableAttributedString.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.clear , range: {0, 2})

mutableAttributedString.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.yellow , range: {0, 2})
person ozgur    schedule 07.02.2015
comment
Да, в моем редактировании я сделал что-то подобное, чтобы заставить это работать. Знаете, зачем это нужно? - person Bill; 07.02.2015
comment
Я думаю, что это ошибка в iOS SDK, потому что я видел похожие вопросы в Интернете, когда впервые столкнулся с этой проблемой много лет назад, и мне пришлось сделать это, чтобы заставить ее работать. - person ozgur; 07.02.2015

Это также Ваша ошибка:

Просто сделайте это:

self.detailDescriptionLabel.numberOfLines = 2; // <---

И ваша проблема решена.

person iBhavin    schedule 07.02.2015
comment
Хорошо, я попробовал еще раз, используя код, а не редактор раскадровки, и это сработало. Вы знаете, почему это изменение необходимо? - person Bill; 07.02.2015
comment
На самом деле, я нахожу это решение во время НИОКР. - person iBhavin; 11.02.2015