NSAttributedString и emoji: диапазон, который я никогда не устанавливал, кажется установленным - PullRequest
3 голосов
/ 02 мая 2019

Это самая странная проблема (игровая площадка XCode 10.2.1):

let a = "String with emoji ?"
var b = "00:00 0000"

var nsa = NSMutableAttributedString(string: a)
var nsb = NSMutableAttributedString(string: b)
nsb.addAttributes([.foregroundColor: UIColor.red], 
                  range: NSRange(location: 0, length: nsb.length))
nsa.append(nsb)

и nsa выглядит так:

enter image description here

00 после эмодзи имеет ту же ширину и высоту, что и персонаж эмодзи. Но это становится страннее. Эффект распространяется только на цифры 0-9, пробел и хэш (#). Если я заменю 00:00 0000 на другую строку, то все будет нормально:

enter image description here

Кажется, что внутри NSMutableAttributedString применяет атрибут к символу смайликов, а затем неправильно расширяет его до префикса присоединенной строки, состоящего из определенных символов.

Это известная проблема? Я нашел обходной путь, добавив тонкий неразрывный пробел к первой строке a + "\u{2009}". Есть ли лучший способ справиться со странностями смайликов в Swift?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Вот официальный ответ Apple:

Мы определили, что эту проблему вы должны решить.

Так как приложение явно не указывает шрифт для строка, она полагается на систему резервирования шрифтов.

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

Пожалуйста, дайте нам знать, решена ли проблема для вас путем обновления ваш отчет об ошибке.

Это просто ужасно.

0 голосов
/ 02 мая 2019

Проблема с отображением отображается на игровой площадке приписанной строки. Это также происходит, если вы используете приписанную строку в UITextView. Но проблема не возникает в UILabel.

Все проблемы с отображением исчезнут, если вы присвоите атрибутивной строке шрифт.

Добавление:

nsa.addAttributes([.font: UIFont.systemFont(ofSize: 16)],
    range: NSRange(location: 0, length: nsa.string.utf16.count))

после добавления двух строк все проблемы исчезают. Очевидно, вы должны использовать любой нужный шрифт.

Вы всегда должны применять шрифт к атрибутной строке, чтобы компоненты пользовательского интерфейса знали, как правильно отображать содержимое строки атрибута.

...