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"
Что приводит к этому:
[
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 поможет вам - поддержка языков с написанием справа налево