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行的高度限制