2

我在NSAttributedStrings使用.NSParagraphStyleUISemanticContentAttributeForceRightToLeft

我有一个 UI 上只有 2 个标签的演示应用程序。

它们有前导和尾随约束。

两个标签

我正在 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它开始工作。请注意,我什至没有改变它的任何东西,但只是通过使用它就会弄乱对齐方式。

关于可能导致这种情况的任何想法?

4

1 回答 1

2

NSMutableParagraphStyle有一个属性baseWritingDirection(枚举NSWritingDirection)。将其设置为rightToLeft

尝试这个

paragraphStyle.baseWritingDirection = NSWritingDirection.rightToLeft


编辑:(希望对您有所帮助)

如果属性 (baseWritingDirection) 的值为 NSWritingDirectionNaturalDirection,则接收方将写入方向解析为 NSWritingDirectionLeftToRight 或 NSWritingDirectionRightToLeft,具体取决于用户语言偏好设置的方向。

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

languageName:以 ISO 语言区域格式指定的语言。可以为 nil 以返回从用户的默认数据库派生的默认写入方向。


使用 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 文档将为您提供帮助 -支持从右到左的语言

于 2018-01-18T16:46:56.840 回答