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

时间:2019-04-30 09:56:07

标签: ios swift uilabel

Xcode 10,Swift 5,iOS 12

我在水平StackView中有两个UILabel

  • StackView:对齐填充和分布填充
  • 标签1:没有特殊限制
  • 标签2:比例宽度(标签1的一半大小)

标签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)。

实际上什么时候将标签设置为适当的宽度,那么何时以及如何检查尺寸?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

编辑:

每当您更改视图控制器的视图或子视图时,都会调用

viewDidLayoutSubviews ...与视图控制器的视图有关的更改。我认为在您的情况下,多次调用是可以的,因为当用户旋转设备时,您要检查布局是否已更改,因此您现在需要显示较短/较长的文本。同样,当其他视图元素定义了自动布局约束,并且您对其进行更改时,可能会导致标签缩小/增长等。

编辑2:

使用自动布局时,您基本上不知道标签的大小...在故事板或Nib文件中使用tableViewCellForRowAt()检查宽度时会遇到这种情况。

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

答案 1 :(得分:0)

为此使用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)
  

注意:您可以将任何想要的整数传递给   variantFittingPresentationWidth()

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

最好将swift文件中的所有字符串提取到stringsdict这样的单独文件中。