当我使用NSAttributedStrings
时,我遇到了使用NSParagraphStyle
和UISemanticContentAttributeForceRightToLeft
的UILabels的问题。
我有一个只有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"
结果如下:
[
labelB (Bar)
按预期工作,但labelA (Foo)
不是。如果我只是删除NSParagraphStyle
它开始工作。请注意,我甚至没有更改任何内容,但只是通过使用它,它会弄乱对齐。
关于可能导致这种情况的任何想法?
NSMutableParagraphStyle有一个属性baseWritingDirection(enum NSWritingDirection)。将它设置为rightToLeft
试试这个
paragraphStyle.baseWritingDirection = NSWritingDirection.rightToLeft
编辑:(愿这对你有所帮助)
如果property(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
以下是语言列表:Codes for the Representation of Names of Languages
注意:使用ISO 639-1
代码语言。标签文本的方向取决于语言的自然方向。
结果如下:
这个Apple文档将帮助你 - Supporting Right-to-Left Languages