为什么自动收缩不能正常工作?

时间:2015-10-24 08:28:50

标签: xcode swift uilabel nslayoutconstraint

这个问题一直困扰着我。通常当我在Storyboard中布置UILabel时,我希望它可以使用不同的屏幕宽度进行缩放。我通过创建一个约束来使用它,该约束将其宽度设置为与其超视图的宽度成比例。

然后我将文本的大小设置为300,打开自动收缩并将最小大小设置为1.理想情况下,这会缩小文本,以便在拟合约束时最大可能。

但是,这种情况发生了。

example

左侧的标签已自动收缩,但文字未展开以填充(黄色只是标签的背景,而不是另一个视图)。另一方面,右边的标签有一个固定的大小,但宽度相同,表明字体有更大的增长空间。

出了什么问题?任何修复都将不胜感激。

1 个答案:

答案 0 :(得分:2)

经过反复试验,我找到了解决此问题的方法,以较小的间隔1收缩字体,以便更好地符合标签的宽度。

extension UILabel {
func shrinkToFitWidth(margin: CGFloat?) {

    // margin parameter will shrink the font by a certain amount more than necessary. 
    // Use this if you want a label with smaller text on a bigger background. Otherwise, use 0.

    var initialSize : CGSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])

    if initialSize.width > self.frame.size.width
    {
        while initialSize.width > self.frame.size.width
        {
            self.font = self.font.fontWithSize(self.font.pointSize - 1)
            initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
        }
    } else {
        while initialSize.width < self.frame.size.width
        {
            self.font = self.font.fontWithSize(self.font.pointSize + 1)
            initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
        }
        // went 1 point too large so compensate here
        self.font = self.font.fontWithSize(self.font.pointSize - 1)
    }

    self.font = self.font.fontWithSize(self.font.pointSize - margin!)
}

func shrinkToFitHeight(margin: CGFloat?) {

    // margin parameter will shrink the font by a certain amount more than necessary. 
    // Use this if you want a label with smaller text on a bigger background. Otherwise, use 0.

    var initialSize : CGSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])

    if initialSize.height > self.frame.size.height
    {
        while initialSize.height > self.frame.size.height
        {
            self.font = self.font.fontWithSize(self.font.pointSize - 1)
            initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
        }
    } else {
        while initialSize.height < self.frame.size.height
        {
            self.font = self.font.fontWithSize(self.font.pointSize + 1)
            initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
        }

        // went 1 point too large so compensate here
        self.font = self.font.fontWithSize(self.font.pointSize - 1)
    }

    self.font = self.font.fontWithSize(self.font.pointSize - margin!)
}

请注意,为了实现这一点,应该在视图控制器的viewDidLayoutSubviews方法中调用它,以便应用约束。

干杯!