Swift 3 – 调整字体大小以适应宽度,多行

我有一个UILabel,它被设置为42.0pt字体,并且标签的宽度是基于除了标签本身之外的因素(也就是标签的左侧和右侧的东西决定标签的宽度)使用自动约束来设置的。

我想自动调整字体大小,以适应标签的宽度,但也可以打破两行。 与此类似:

在这里输入图像说明

我知道你可以调整字体大小来适应标签的宽度,但只有当行数设置为1时。

我将如何做到这一点?

有趣的问题。 这是我的解决scheme:

let labelText = self.mylabel.text //where mylabel is the label let labelSeperated = self.labelText.components(seperatedBy: " ") if labelSeperated.count > 1 { myLabel.lineBreakMode = .byWordWrapping myLabel.numberOfLines = 0 } else { myLabel.numberOfLines = 1 myLabel.adjustsFontSizeToFitWidth = true } 

把这个代码放在标签将被改变的地方。 如果有两个或更多的数字,它将行号设置为0,否则设置为1行。

如果您想调整多行标签,请查看此博客文章。

Swift 3

我看了张贴111的post。 不幸的是,它在Obj-C和sizeWithFont: ,constrainedToSize: , lineBreakMode:方法已被弃用。 ( – – );

他的回答很好,但还没有提供一个固定的大小。 我所做的就是从一个UILabel开始,除了高度以外,这个UILabel (这对大多数人来说可能是一样的)。

 let myFrame = CGRect(x: 0, y:0, width: 200, height: self.view.height) let myLbl = UILabel(frame: myFrame) let finalHeight:CGFloat = 300 myLbl.font = UIFont(name: "Chalkduster", size: 16.0) myLbl.lineBreakMode = .byWordWrapping myLbl.numberOfLines = 0 myLbl.text = "Imagine your long line of text here" addSubview(myLbl) myLbl.sizeToFit() guard myLbl.frame.height > finalHeight else { return } var fSize:CGFloat = 16 //start with the default font size repeat { fSize -= 2 myLbl.font = UIFont(name: "Chalkduster", size: fSize) myLbl.sizeToFit() } while myLbl.frame.height > finalHeight 

你可以看到,如果不需要的话,有一个guard阻止了resize。 而且,多次调用sizeToFit()并不理想,但我想不出另一种方式。 我试图在循环中使用myLbl.font.withSize(fSize) ,但它不会工作,所以我使用了完整的方法。

希望对你有帮助!

@ Krunal的答案对我有帮助,但是当你的行数不明时,这个问题就不起作用了,所以我提出了这个解决scheme。 您还可以设置最大和最小字体大小。 希望这可以帮助别人!

Swift 2.2 – 对不起,还没有迁移到Swift 3呢。

 func setFontForLabel(label:UILabel, maxFontSize:CGFloat, minFontSize:CGFloat, maxLines:Int) { var numLines: Int = 1 var textSize: CGSize = CGSizeZero var frameSize: CGSize = CGSizeZero var font: UIFont = UIFont.systemFontOfSize(maxFontSize) frameSize = label.frame.size textSize = (label.text! as NSString).sizeWithAttributes([NSFontAttributeName: font]) // Determine number of lines while ((textSize.width/CGFloat(numLines)) / (textSize.height * CGFloat(numLines)) > frameSize.width / frameSize.height) && numLines < maxLines { numLines += 1 } label.font = font label.adjustsFontSizeToFitWidth = true label.numberOfLines = numLines label.minimumScaleFactor = minFontSize/maxFontSize } 

这将工作..

  • 为您的标签设置最小比例因子 。 如图所示。
  • 如果你想要更多的行数,请设置行的数量= 2 //或零(0)
  • 将线路制动模式'byTruncatingTail'设置为2行

Swift 3
将dynamic文本信息的行数设置为零,这将对变化的文本有用。

 var label = UILabel() let stringValue = "A label\nwith\nmultiline text." label.text = stringValue label.numberOfLines = 2 // 0 label.lineBreakMode = .byTruncatingTail // or .byWrappingWord label.minimumScaleFactor = 0.5 // It is required but nice to have a minimum scale factor to fit text into label frame 

在这里输入图像说明

此外,不要为您的标签设置超过2行的高度限制