Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 为什么自动收缩不能正常工作?_Xcode_Swift_Uilabel_Nslayoutconstraint - Fatal编程技术网

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

Xcode 为什么自动收缩不能正常工作?,xcode,swift,uilabel,nslayoutconstraint,Xcode,Swift,Uilabel,Nslayoutconstraint,这个问题困扰了我好一阵子了。通常,当我在故事板中布局UILabel时,我希望它以不同的屏幕宽度进行缩放。我通过创建一个约束来使用它,该约束将其宽度设置为与其superview的宽度成比例 然后我将文本的大小设置为300,启用自动收缩并将最小大小设置为1。理想情况下,这将缩小文本,使其在拟合约束时尽可能最大 但是,这种情况发生了 左侧的标签具有自动收缩功能,但文本不会展开以填充(黄色只是标签的背景,而不是另一个视图)。另一方面,右边的标签大小固定,但宽度相同,表明字体有更大的增长空间 怎么了?任

这个问题困扰了我好一阵子了。通常,当我在故事板中布局UILabel时,我希望它以不同的屏幕宽度进行缩放。我通过创建一个约束来使用它,该约束将其宽度设置为与其superview的宽度成比例

然后我将文本的大小设置为300,启用自动收缩并将最小大小设置为1。理想情况下,这将缩小文本,使其在拟合约束时尽可能最大

但是,这种情况发生了

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


怎么了?任何修复都将不胜感激。

经过反复试验,我找到了解决这个问题的方法,它以较小的间隔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!)
}
扩展UILabel{ func shrinkToFitWidth(边距:CGFloat?){ //margin参数会将字体缩小一定量,超出需要。 //如果要在较大的背景上使用较小文本的标签,请使用此选项。否则,请使用0。 var initialSize:CGSize=self.text!.SizeWithatAttributes([NSFontAttributeName:self.font]) 如果initialSize.width>self.frame.size.width { 而initialSize.width>self.frame.size.width { self.font=self.font.fontWithSize(self.font.pointSize-1) initialSize=self.text!.SizeWithatAttributes([NSFontAttributeName:self.font]) } }否则{ 而initialSize.widthself.frame.size.height { 而initialSize.height>self.frame.size.height { self.font=self.font.fontWithSize(self.font.pointSize-1) initialSize=self.text!.SizeWithatAttributes([NSFontAttributeName:self.font]) } }否则{ 而initialSize.height 请注意,为了实现这一点,应该在视图控制器的
viewdilayoutsubviews
方法中调用它,以便应用约束


干杯!

这两个例子中的标签都是从边到边的吗?你能再添加两个屏幕截图吗?当你有一个非常大的单词时,会发生什么?@Korpel标签不是在彩色背景上,颜色是标签的背景。这有意义吗?ofc有意义。你试过用一个较小的标签来代替这么大的标签吗?在请改回UIView,让标签占用更小的空间,然后再试一次?@Korpel是的,同样的行为。事实上,我的实际项目有一个视图作为背景;我创建了一个新项目来测试东西并更清楚地演示问题。我可以问一下您使用的是什么版本吗?这是您的应用程序在我的Xcode上尝试的图像