根据标签宽度更改 UILabel 的文本

Change text of UILabel depending on label width

Xcode10,Swift5,iOS12

我在水平 StackView 中有两个 UILabel

标签 2 包含的单词对于 iPhone SE(支持的最小设备)上的标签大小来说太长了,所以我使用的是缩写版本。在更大的设备上,例如一个 iPad,我想显示完整的单词(应该只设置一次),所以我尝试了这个:

var label2set:Bool = false
print("label2: \(label2.frame.width)")

if !label2set && label2.frame.width > 100 && (UIApplication.shared.statusBarOrientation == .portrait || UIApplication.shared.statusBarOrientation == .portraitUpsideDown) {
    label2set = true
    label2.text = "VeryLongLabelText"
}

无论我在viewDidLoad还是viewWillAppear中使用这段代码,第一次调用时假设标签宽度只有70左右(即使在iPad上),甚至虽然它在模拟器中明显更大。

如果我将代码放在 viewWillAppear 中并删除 label2set 的检查,然后通过我的 NavigationController 切换到下一个视图并再次返回到我原来的视图,代码将被正确调用并且标签显示全文(宽度:iPad 上大约 200)。

标签什么时候真正设置为适当的宽度,那么我什么时候可以检查尺寸以及如何检查尺寸?

如果您真的需要这样的功能,为什么不直接使用习语检查并更改标签文本本身呢?

if UIDevice.current.userInterfaceIdiom == .phone {
    // ...
} else {
    // ...
}

您可以将代码放在 viewDidLayoutSubviews 方法中:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // do something...
}

编辑:

viewDidLayoutSubviews 将在您每次对视图控制器的视图或子视图进行更改时调用...涉及视图控制器视图的更改。我认为在您的情况下,多次调用它是可以的,因为当用户旋转设备时,您想检查布局是否以现在需要显示 shorter/longer 文本的方式发生变化。此外,当其他视图元素定义了自动布局约束并且您更改了它们的某些内容时,可能会导致您的标签变为 shrink/grow 等

编辑 2:

使用自动布局时,您基本上无法知道标签的尺寸...当您在 tableViewCellForRowAt() 中检查宽度时,您会在故事板或 Nib 文件中使用。

我建议您只使用两件事来确定要使用哪个版本的文本... 整体 window width/height当前方向 (如果支持拆分视图,则宽度 class)。在这种情况下,您在设置单元格标签之前就知道应该设置哪些文本。您只需要决定是否在当前方向和整体宽度值下切换到较短的文本。

为此使用 stringsDict 文件。创建一个 stringsdict 类型的文件。遵循这种格式:

<key>Login</key>
<dict>
    <key>NSStringVariableWidthRuleType</key>
    <dict>
        <key>100</key>
        <string>Login.</string>
        <key>200</key>
        <string>You must login before continuing.</string>
        <key>300</key>
        <string>Please enter your username and password to continue.</string>
    </dict>
</dict>

以及稍后在代码中的某处:

let localized = NSLocalizedString("Login", comment: "Prompt for user to log in.") as NSString

label.text = localized.variantFittingPresentationWidth(300)

NOTE: You can pass any integer you want into variantFittingPresentationWidth()

iOS 将自动解析它以在您的字符串字典中找到最佳匹配项,必要时向下计数。例如,如果您尝试加载宽度为 500 的字符串,将返回 300 字符串,但如果您尝试加载 299,则将返回 200 字符串。

同时将 swift 文件中的所有字符串提取到单独的文件中,如 stringsdict 始终是最佳实践。