UILabel 显示错误的本地化字符串



我在通过 Localizable.stringdict 本地化字符串时遇到问题。我确实为不同大小的测试字符串设置了不同的本地化。请参阅 Localizable.stringdict:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Test</key>
<dict>
<key>NSStringVariableWidthRuleType</key>
<dict>
<key>20</key>
<string>test</string>
<key>25</key>
<string>test message</string>
<key>50</key>
<string>This is a test message</string>
</dict>
</dict>
</dict>
</plist>

我的视图控制器如下所示:

class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let string = NSLocalizedString("Test", comment: "This is a test message") as NSString
let widthFormattedString = string.variantFittingPresentationWidth(50) as String
print(widthFormattedString)
label.text = widthFormattedString
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

我想将本地化字符串分配给标签。我的视图控制器中的打印正在打印"这是一条测试消息",但视图显示"测试消息"。我不会在其他任何地方更改标签的文本。所以我想知道为什么显示错误的消息。谁能帮忙?

根据编写此答案的文档,它指出:

注意

为标准 UIKit 控件(如UILabel(设置用户可见文本时,不要调用此方法。UIKit 提供对自适应字符串的内置支持,并根据下述行为自动选择适合当前屏幕大小的字符串宽度变体。

这似乎证实了你的经历。

您自己做的打印输出是正确的,因为它为您提供了您为值请求的字符串50

我的视图控制器中的打印正在打印"这是测试消息">

而 UILabel 通过 UIKit 标准机制获取字符串并显示为:

但视图显示"测试消息">

我的结论是,如果您使用 UIKit 控件,则不需要自己执行此操作。这对于自定义控件或我不知道的其他用例可能很有帮助。

最新更新