UILabel не работает с NSAttributedString + NSParagraphStyle для справа налево

У меня проблемы с UILabels, которые используют NSAttributedStrings с NSParagraphStyle когда я использую UISemanticContentAttributeForceRightToLeft,

У меня есть демо-приложение с двумя ярлыками на интерфейсе пользователя.

У них есть ведущие и конечные ограничения.

Две метки

Я делаю приложение справа налево в AppDelegate с

UIView.appearance().semanticContentAttribute = .forceRightToLeft

И я просто настраиваю метки с помощью следующего кода

let labelAText = "Foo"

let mutAttrString = NSMutableAttributedString(string: labelAText)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .natural
paragraphStyle.baseWritingDirection = .natural

mutAttrString.setAttributes([NSAttributedStringKey.paragraphStyle: paragraphStyle.copy()], range: NSMakeRange(0, labelAText.count))

labelA.attributedText = mutAttrString
labelB.text = "Bar"

Что приводит к этому:

[неправильный ярлык [2

labelB (Bar) работает как положено, но labelA (Foo) нет. И если я просто удалю NSParagraphStyle это начинает работать. Имейте в виду, что я даже ничего не изменяю на этом, но просто используя это, это портит выравнивание.

Есть мысли о том, что может быть причиной этого?

1 ответ

NSMutableParagraphStyle имеет свойство baseWritingDirection (перечисление NSWritingDirection). Установите его в rightToLeft

Попробуй это

paragraphStyle.baseWritingDirection = NSWritingDirection.rightToLeft


Изменить:(Может это вам поможет)

Если значением свойства (baseWritingDirection) является NSWritingDirectionNaturalDirection, получатель разрешает направление записи либо в NSWritingDirectionLeftToRight, либо в NSWritingDirectionRightToLeft, в зависимости от направления для настройки предпочтения языка пользователя.

class func defaultWritingDirection(forLanguage languageName: String?) -> NSWritingDirection

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


Решение с использованием languageName = "ar"

@IBOutlet weak var labelA: UILabel!

let labelAText = "Foo"
let mutAttrString = NSMutableAttributedString(string: "Foo")
let paragraphStyle = NSMutableParagraphStyle()
//paragraphStyle.alignment = .natural
paragraphStyle.baseWritingDirection = NSParagraphStyle.defaultWritingDirection(forLanguage: "ar")
mutAttrString.setAttributes([NSAttributedStringKey.paragraphStyle: paragraphStyle], range: NSMakeRange(0, labelAText.count))

labelA.attributedText = mutAttrString

Вот список языков: Коды для представления названий языков

Примечание: использовать ISO 639-1 код для языка. Направление текста метки зависит от естественного направления языка.

Вот результат:


Этот документ Apple поможет вам - поддержка языков с написанием справа налево

Другие вопросы по тегам