Xcode 10,Swift 5,iOS 12
我在水平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)。
实际上什么时候将标签设置为适当的宽度,那么何时以及如何检查尺寸?
答案 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
这样的单独文件中。