Swift 3 - 调整字体大小以适合宽度,多行

时间:2017-03-04 03:22:00

标签: ios swift swift3 uilabel font-size

我有一个UILabel,它设置为42.0 pt字体,标签的宽度是根据标签本身以外的因素使用autoconstraints设置的(也就是标签右边和左边的东西确定标签的宽度) )。

我想自动调整字体大小以适应标签的宽度,但是如果可以的话也会分成两行。与此类似:

enter image description here

我知道您可以调整字体大小以适应标签的宽度,但仅限于行数设置为1时。

我将如何做到这一点?

5 个答案:

答案 0 :(得分:2)

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

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行。

如果您想调整多行标签的大小,请查看this博文。

答案 1 :(得分:2)

这将有效..

  • 为您的标签设置最小比例因子。如图所示。
  • 如果您想要更多行数,则设置行数= 2 //或零(0)
  • 将换行模式设置为“.byTruncatingTail”为2行

Swift 3
为动态文本信息设置零行数,它对于改变文本非常有用。

brew install opencv3 --with-python

enter image description here

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

答案 2 :(得分:1)

雨燕5

extension UILabel{
func adjustsFontSizeToFit(maxFontSize:CGFloat,width:CGFloat,height:CGFloat) {
    self.numberOfLines = 0
    var fontSize:CGFloat = maxFontSize
    if self.sizeThatFits(CGSize(width: width, height: .infinity)).height > height{
        while self.sizeThatFits(CGSize(width: width, height: .infinity)).height > height{
            fontSize -= 1
            self.font = self.font.withSize(fontSize)
        }
    }
}

}

答案 3 :(得分:0)

Swift 3

我查看了paper111发布的帖子。不幸的是,它在Obj-C中并且sizeWithFont: ,constrainedToSize: , lineBreakMode:方法已被弃用。 ( - - );

他的回答很好,但仍然没有提供固定的尺寸。我所做的是从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阻止调整大小。此外,多次致电sizeToFit()并不理想,但我无法想到另一种方式。我尝试在循环中使用myLbl.font.withSize(fSize),但它不起作用,所以我使用了完整的方法。

希望它适合你!

答案 4 :(得分:0)

@krunal的答案帮助了我,但是当你的线数不明数时它没有用,所以这就是我提出的解决方案。您还可以设置最大和最小字体大小。希望这有助于某人!

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
}
相关问题