Получение изображения, встроенного в NSAttributedString (через NSTextAttachment), для обработки как одного символа, чтобы оно не разбивало строки? - PullRequest
5 голосов
/ 09 мая 2019

Я встраиваю изображение в NSAttributedString и хочу, чтобы iOS воспринимала его как символ, являющийся частью слова перед ним, чтобы он не разбивался на собственную строку.Я читал где-то, что должно быть поведением по умолчанию, но я не могу заставить его работать.Вот мой код (я вставляю эту атрибутированную строку как заголовок кнопки):

    var title = "This is an example string. Test testtt"
    let titleTextString = NSMutableAttributedString(string: title)

    let imageAttachment =  NSTextAttachment()
    imageAttachment.image = UIImage(named:"myIcon")
    imageAttachment.bounds = CGRect(x: 0, y: 1.0, width: 14, height: 6)
    let imageAttachmentString = NSMutableAttributedString(attachment: imageAttachment)


    titleTextString.append(imageAttachmentString)
    button.setAttributedTitle(titleTextString, for: .normal)

Вот изображение того, как это выглядит:

enter image description here

Как видите, в конце строки нет пробелов.Я пытаюсь заставить метку считать текстовое вложение обычным непробельным символом, и, таким образом, частью слова «testtt», что может привести к переносу слова «testtt» (в противном случае слова правильно переносятся словамии я установил перенос слов как на метку, так и в стиле абзаца NSAttributedString).

Сложность в том, что я обнаружил существование неразрывного, который решает проблему, но заставляет другиечасти строки должны быть излишне сломаны.Если я добавлю неразрывный пробел в конец строки:

var title = "Это пример строки. Test testtt" + "\ u {A0}"

I тогдаполучить правильное поведение прерывания, но по какой-то причине предыдущее слово также неоправданно нарушено:

enter image description here

Кто-нибудь знает, как объяснить это поведениемправильно (т.е. считать изображение как любую другую букву, а не как пробел?)

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Вы можете сделать это, добавив zero-width non-breaking space: \u{FEFF} в конец вашей исходной строки.

var title = "This is an example string. Test testtt\u{FEFF}"
let titleTextString = NSMutableAttributedString(string: title)

let imageAttachment =  NSTextAttachment()
imageAttachment.image = UIImage(named:"myIcon")
imageAttachment.bounds = CGRect(x: 0, y: 1.0, width: 14, height: 6)
let imageAttachmentString = NSMutableAttributedString(attachment: imageAttachment)


titleTextString.append(imageAttachmentString)
button.setAttributedTitle(titleTextString, for: .normal)

Кредит на этот вопрос SO + ответ В UILabel можно ли принудительно вызватьстрока НЕ ​​ломаться в определенном месте

РЕДАКТИРОВАТЬ:

Чтобы ответить на ваш вопрос о неправильное слово завернутый.Вы можете найти ответ здесь .Это новое поведение для переноса слов, введенное Apple.

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

enter image description here

Установите текст метки заголовка кнопки lineBreakMode как .byWordWrapping и textAlignment как .center, чтобы получить вывод в соответствии с вашим аспектом. См. Следующий код.

let title = "This is an example string. Test testtt"
let titleTextString = NSMutableAttributedString(string: title)

let imageAttachment =  NSTextAttachment()
imageAttachment.image = UIImage(named:"myIcon")
imageAttachment.bounds = CGRect(x: 0, y: 1.0, width: 14, height: 7)
let imageAttachmentString = NSMutableAttributedString(attachment: imageAttachment)


titleTextString.append(imageAttachmentString)
button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center
button.setAttributedTitle(titleTextString, for: .normal)
...