如何调整字体大小以适应 UILabel 的高度和宽度

Posted

技术标签:

【中文标题】如何调整字体大小以适应 UILabel 的高度和宽度【英文标题】:How to adjust font size to fit height and width of UILabel 【发布时间】:2016-01-22 17:29:58 【问题描述】:

我有一个正方形 UILabel(黄色),其中包含一个字母。

我使用this SO answer 中的以下代码来调整字体大小,使其适合UILabel

letterLabel.font = UIFont(name: letterLabel.font.fontName, size: 100)
letterLabel.adjustsFontSizeToFitWidth = true
letterLabel.textAlignment = NSTextAlignment.Center

如屏幕截图所示,字体大小取决于宽度。但是由于文本只有一个字母,因此我们还需要查看高度。我们如何调整字体大小,使高度也在UILabel 之内?

【问题讨论】:

尝试使用letterLabel.sizeToFit() 我面临着完全相同的情况。你找到解决方案了吗?如果能用IB做,那就更好了! 【参考方案1】:

我没有找到任何简单的解决方案,所以我做了这个扩展:

extension UILabel 
    func setFontSizeToFill() 
        let frameSize  = self.bounds.size
        guard frameSize.height>0 && frameSize.width>0 && self.text != nil else return

        var fontPoints = self.font.pointSize
        var fontSize   = self.text!.size(withAttributes: [NSAttributedStringKey.font: self.font.withSize(fontPoints)])
        var increment  = CGFloat(0)

        if fontSize.width > frameSize.width || fontSize.height > frameSize.height 
            increment = -1
         else 
            increment = 1
        

        while true 
            fontSize = self.text!.size(withAttributes: [NSAttributedStringKey.font: self.font.withSize(fontPoints+increment)])
            if increment < 0 
                if fontSize.width < frameSize.width && fontSize.height < frameSize.height 
                    fontPoints += increment
                    break
                
             else 
                if fontSize.width > frameSize.width || fontSize.height > frameSize.height 
                    break
                
            
            fontPoints += increment
        

        self.font = self.font.withSize(fontPoints)
    

【讨论】:

【参考方案2】:

我只需要在标签中显示一个字母(姓名首字母),所以要求很明确,它必须缩放以适应高度。

解决方案:

class AnyView : UIView
     private var nameLabel:UILabel! = nil

     override func layoutSubviews() 
        super.layoutSubviews()
        //Considering the nameLabel has been already created and added as subview with all the constraint set
        nameLabel.font = nameLabel.font.withSize(nameLabel.bounds.height * 0.6/*The factor can be adjusted as per need*/)
    

【讨论】:

【参考方案3】:

我已经测试过你的代码对我来说可以正常工作。

我认为单元格高度是个问题,我没有给出单元格高度。 尝试删除单元格高度

【讨论】:

【参考方案4】:

试试[label sizeToFit][label sizeThatFits:(CGSize)]

【讨论】:

这会调整标签的大小以适应文本,而不是像所要求的那样相反。

以上是关于如何调整字体大小以适应 UILabel 的高度和宽度的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容?

调整UILabel的大小以适应字体大小和文本

调整 UILabel 的大小以适应自定义 UITableViewCell 中的文本,无论宽度如何

调整UILabel的大小以适应Word Wrap

如何根据标签可用的高度调整 UILabel 字体大小

将字体大小调整为 uilabel 宽度