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

时间:2017-07-31 13:41:36

标签: ios swift localization xcode9-beta

我在通过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>

我的ViewController如下所示:

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.
    }
}

我想将本地化字符串分配给标签。我的ViewController中的打印正在打印“这是测试消息”,但视图显示“测试消息”。我不会在其他任何地方更改标签的文字。所以我想知道为什么显示错误的信息。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

根据documentation在写此答案时指出:

注意

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

这似乎可以确认您的经历。

您自己执行的打印输出是正确的,因为它会为您提供您要求的字符串,值为50

ViewController中的打印内容正在打印“这是一条测试消息”

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

但是视图显示“测试消息”

我得出的结论是,如果您使用UIKit控件,则无需自己做。这可能对自定义控件或我不知道的其他用例很有帮助。