4

Конец моего NSAttributedString с emojis в содержимом не отформатирован. Я пытаюсь отформатировать всю строку (для упрощения) в этом примере установите цвет текста в белый, но некоторые из текста остаются неформатированными при вводе UILabel.End of NSAttributedString с emojis оставлен неформатированным

enter image description here

В настоящее время я использую

let attributedString = NSMutableAttributedString(string: contents) 

attributedString.addAttribute(
    NSForegroundColorAttributeName, 
    value: UIColor.white, 
    range: NSMakeRange(0, contents.characters.count) 
) 

label.attributedText = attributedString 

Я также пытался получать длину с помощью contents.utf8.count, но получить тот же результат.

Я заметил, что число неформатированных символов совпадает с количеством эмоций в строке. Может ли это иметь какое-то отношение к тому, что происходит?

ответ

15

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

UTF означает Unicode Transformation format, или Unicode для краткости. Это позволяет компьютерам, телефонам, планшетам и всему остальному электронному использовать один и тот же стандартный набор символов.

Те, кто его реализует, могут выбрать способ визуализации текста, но очень важно, чтобы устройства обменивались данными с использованием стандартизованного набора символов. В противном случае, посылая сообщение «Hello, World», чтобы кто-то может показать, как «Ifmmp, Xpsme»

Для того, чтобы получить фактическую длину строки для использования в NSMakeRange, используйте NSAttributedString.length или Int("\(contents.endIndex)").

Таким образом, код должен выглядеть следующим образом

let attributedString = NSMutableAttributedString(string: contents) 

attributedString.addAttribute(
    NSForegroundColorAttributeName, 
    value: UIColor.white, 
    range: NSMakeRange(0, attributedString.length) 
) 

label.attributedText = attributedString 

Теперь это будет производить правильно отформатированный текст

enter image description here

+3

Ваше решение является правильным, но объяснение может быть улучшено (что такое Символ UTF?). - 'String.characters.count' подсчитывает расширенные кластеры графем, тогда как NSRange связан с NSString и подсчитывает кодовые точки UTF-16. Поэтому альтернативным решением было бы использовать «NSMakeRange (0, contents.utf16.count)», как в http://stackoverflow.com/a/30845969/1187415. –

+0

Спасибо за ваше решение! Это хорошо работает. (Y) – Gati

+0

Отлично работает. что задержка времени – Nookaraju