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