ios - UILabel 不适用于从右到左的 NSAttributedString + NSParagraphStyle

标签 ios swift uilabel right-to-left nsparagraphstyle

当我使用 UISemanticContentAttributeForceRightToLeft 时,我遇到了使用 NSAttributedStringsNSParagraphStyle 的 UILabels 的问题。

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

它们具有前导和尾随约束。

The two labels

我正在 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"

结果如下:

[wrong label[2]

labelB (Bar) 按预期工作,但 labelA (Foo) 未按预期工作。如果我只是删除 NSParagraphStyle 它就会开始工作。请注意,我什至没有更改它的任何内容,但仅仅使用它就会弄乱对齐方式。

有什么想法可能导致这种情况吗?

最佳答案

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

试试这个

paragraphStyle.baseWritingDirection = NSWritingDirection.rightToLeft


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

If the value of property (baseWritingDirection) is NSWritingDirectionNaturalDirection, the receiver resolves the writing direction to either NSWritingDirectionLeftToRight or NSWritingDirectionRightToLeft, depending on the direction for the user’s language preference setting.

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

语言名称:以 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 代码作为语言。标签文本的方向取决于语言的自然方向。

这是结果:

enter image description here


这份 Apple 文档将为您提供帮助 - Supporting Right-to-Left Languages

关于ios - UILabel 不适用于从右到左的 NSAttributedString + NSParagraphStyle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48326178/

相关文章:

ios - 没有 Xib 和 Storyboard的旧应用程序。使ios9兼容

swift - 向下转换后附加到字典中的数组时出现不可变值错误

ios - UILabel 为 nil - 无法更新 UILabel 的文本

iphone - UILabel 在行太长时自动换行

c++ - NSString* 到 char*?

ios - SKPhysics body 成分?

ios - swift : How to update UILabel from another class X: UIButton

ios - 泛型不适用于隐式解包的可选

swift - 在应用程序中显示一次 UIAlert

iphone - 使用自定义字体时如何垂直更正导航栏的 titleView 文本位置?