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

Я встраиваю изображение в 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)

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

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

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

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

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

Затем я получаю правильное поведение при разрыве, но по какой-то причине предыдущее слово также без надобности сломано:

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

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


person milohoffman    schedule 09.05.2019    source источник
comment
Не могли бы вы показать скриншот, что получается? Или, может быть, образец проекта для воспроизведения проблемы? Я пробую ваш код, и изображение представляет собой символ в той же строке без пробелов.   -  person Anton Vlasov    schedule 12.05.2019
comment
Привет, Антон, я добавил снимок экрана и попытался лучше описать проблему. Он не показывает никаких пробелов, проблема в том, что он обрабатывает NSTextAttachment как пробел / новое слово с целью переноса слов, и я хочу, чтобы текст перед ним (testtt в приведенном выше примере) был обернут изображение.   -  person milohoffman    schedule 13.05.2019


Ответы (2)


Вы можете сделать это, добавив 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.

person Gustavo Conde    schedule 13.05.2019

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

Задайте текст метки заголовка кнопки 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)
person AtulParmar    schedule 16.05.2019