首页 文章

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

提问于
浏览
8

我有一个UILabel,它被设置为42.0 pt字体,标签的宽度是使用基于标签本身以外的因素的自动约束设置的(也就是标签右边和左边的东西确定标签的宽度) .

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

enter image description here

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

我怎么做到这一点?

4 回答

  • 0

    这将工作..

    • 为您的标签设置 minimum scale factor . 如图所示 .

    • 如果想要更多行数,则设置行数= 2 //或零(0)

    • 将换行模式设置为'.byTruncatingTail',共2行

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

    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 not required but nice to have a minimum scale factor to fit text into label frame
    

    enter image description here

    另外,不要为标签设置超过2行的高度约束 .

  • 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博文 .

  • 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) 但它不起作用,所以我使用了完整的方法 .

    希望这对你有用!

  • 1

    @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
    }
    

相关问题