Swift:动态可调整大小标签

时间:2015-07-14 06:04:46

标签: ios swift timer interface-builder constraints

有关Auto Contraints和动态可调整大小标签的问题。

我有一个初始显示00:00.00(分钟,秒,毫秒)的计时器标签。当此计时器达到一小时或更长时间时,我希望将标签大小调整为00:00:00.00,同时保留.Centerx约束。标签上的文字对齐设置为左,以便数字的计数不会“抖动”。文本重新证明了不同大小的文本。

我的约束设置如下:

InitialConstraints

下面是计时器最初的显示方式或仅计时(最多59:59:59) MinutesView

并说明当小时数涉及计数时它应该如何看待。

HoursView

现在的问题是,当涉及小时时,宽度会动态调整大小(由于大于约束),这会导致计时器标签在计算不同的毫秒时抖动。

我希望在计算小时宽度为150时重新调整标签大小,并在小时数不计算时返回110小时 - 同时保留CenterX常量。

我计划以小时为单位以编程方式重新调整标签大小:

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)

但是,一旦计时器重置,标签显示如下:

enter image description here

文字不再是视图的中心。我还尝试在复位功能中为.CenterX编写宽度约束,并且在复位标签位置也不会产生任何变化。

通过Interface Builder有更简单的方法吗?有任何想法吗?

谢谢

2 个答案:

答案 0 :(得分:2)

尝试使文本标签比它更宽,然后使文本居中。当添加更多字符时,它将保留中心定位。

答案 1 :(得分:1)

正如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