Swift:动态调整大小标签的宽度限制
Swift: Width constraints for dynamically resizable label
关于自动约束和动态调整大小标签的问题。
我有一个计时器标签,最初显示 00:00.00(分、秒、毫秒)。当此计时器达到一小时或更长时间时,我希望将标签的大小调整为 00:00:00.00,同时保留 .Centerx 约束。标签上的文本对齐设置为左对齐,这样数字计数就不会 'jitter' 文本,因为它 re-justifies 到不同大小的文本。
我的约束设置如下:
这是计时器最初或仅计算分钟时的样子(最多 59:59:59)
这是计算小时数时的样子。
现在的问题是,当涉及小时时,宽度会动态调整(由于大于约束),这会导致计时器标签在计算不同的毫秒数时抖动。
我希望在计算小时数时将标签的宽度调整为 150,在不计算小时数时调整回 110,同时保留 CenterX 常量。
我曾尝试以编程方式 re-size 计数以小时为单位的标签:
let widthConstraint = NSLayoutConstraint(item: TimerLabel, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 150)
if Double(hours) != 0{
TimerLabel.text = "\(strHours):\(strMinutes):\(strSeconds).\(strFraction)"
TimerLabel.addConstraint(widthConstraint)
}
现在在我的重置按钮的 IBAction 函数中我还有:
let widthConstraint2 = NSLayoutConstraint(item: TimerLabel, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 110)
TimerLabel.removeConstraint(widthConstraint)
TimerLabel.addConstraint(widthConstraint2)
然而,一旦计时器重置,标签将显示如下:
文本不再位于视图中心。我还尝试在重置函数中为 .CenterX 编程宽度约束,并且重置标签位置也不会发生变化。
是否有更简单的方法通过 Interface Builder 执行此操作?有任何想法吗?
谢谢
尝试使文本标签比实际更宽,然后将文本居中。当添加更多字符时,它将保留中心定位。
正如 Fonix 所建议的那样,解决方案是使用宽度固定的字体,这在 iOS9 中很容易做到。
let originalFont = UIFont.systemFontOfSize(26)
let originalFontDescriptor = originalFont.fontDescriptor()
let fontDescriptorFeatureSettings = [
[
UIFontFeatureTypeIdentifierKey: kNumberSpacingType,
UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector
]
]
let fontDescriptorAttributes = [UIFontDescriptorFeatureSettingsAttribute: fontDescriptorFeatureSettings]
let fontDescriptor = originalFontDescriptor.fontDescriptorByAddingAttributes(fontDescriptorAttributes)
let font = UIFont(descriptor: fontDescriptor, size: 0)
TimerLabel.font = font
关于自动约束和动态调整大小标签的问题。
我有一个计时器标签,最初显示 00:00.00(分、秒、毫秒)。当此计时器达到一小时或更长时间时,我希望将标签的大小调整为 00:00:00.00,同时保留 .Centerx 约束。标签上的文本对齐设置为左对齐,这样数字计数就不会 'jitter' 文本,因为它 re-justifies 到不同大小的文本。
我的约束设置如下:
这是计时器最初或仅计算分钟时的样子(最多 59:59:59)
这是计算小时数时的样子。
现在的问题是,当涉及小时时,宽度会动态调整(由于大于约束),这会导致计时器标签在计算不同的毫秒数时抖动。
我希望在计算小时数时将标签的宽度调整为 150,在不计算小时数时调整回 110,同时保留 CenterX 常量。
我曾尝试以编程方式 re-size 计数以小时为单位的标签:
let widthConstraint = NSLayoutConstraint(item: TimerLabel, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 150)
if Double(hours) != 0{
TimerLabel.text = "\(strHours):\(strMinutes):\(strSeconds).\(strFraction)"
TimerLabel.addConstraint(widthConstraint)
}
现在在我的重置按钮的 IBAction 函数中我还有:
let widthConstraint2 = NSLayoutConstraint(item: TimerLabel, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 110)
TimerLabel.removeConstraint(widthConstraint)
TimerLabel.addConstraint(widthConstraint2)
然而,一旦计时器重置,标签将显示如下:
文本不再位于视图中心。我还尝试在重置函数中为 .CenterX 编程宽度约束,并且重置标签位置也不会发生变化。
是否有更简单的方法通过 Interface Builder 执行此操作?有任何想法吗?
谢谢
尝试使文本标签比实际更宽,然后将文本居中。当添加更多字符时,它将保留中心定位。
正如 Fonix 所建议的那样,解决方案是使用宽度固定的字体,这在 iOS9 中很容易做到。
let originalFont = UIFont.systemFontOfSize(26)
let originalFontDescriptor = originalFont.fontDescriptor()
let fontDescriptorFeatureSettings = [
[
UIFontFeatureTypeIdentifierKey: kNumberSpacingType,
UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector
]
]
let fontDescriptorAttributes = [UIFontDescriptorFeatureSettingsAttribute: fontDescriptorFeatureSettings]
let fontDescriptor = originalFontDescriptor.fontDescriptorByAddingAttributes(fontDescriptorAttributes)
let font = UIFont(descriptor: fontDescriptor, size: 0)
TimerLabel.font = font