Swift UILabeltext siwft的自动收缩字体大小

Swift UILabeltext siwft的自动收缩字体大小,swift,uilabel,font-size,multiline,autoshrink,Swift,Uilabel,Font Size,Multiline,Autoshrink,我有一个多行UILabel文本,它根据文本长度动态展开。我已经在故事板中设置了适当的自动布局,如果文本过长,它会变大 但是我想把2行文字的字体大小减少到24,3行文字的字体大小减少到20 如果文本为单行,则字体大小应为34 我尝试了最小字体比例=20/34=.58 但是没有用。请建议一种解决方案当更改标签文本后出现一定数量的行时,您可以使用switch语句来确定字体大小 使用中的actualNumberOfLines()算法可以在必要时重新声明此标签的字体 func changeFontSize

我有一个多行UILabel文本,它根据文本长度动态展开。我已经在故事板中设置了适当的自动布局,如果文本过长,它会变大

但是我想把2行文字的字体大小减少到24,3行文字的字体大小减少到20

如果文本为单行,则字体大小应为34

我尝试了最小字体比例=20/34=.58


但是没有用。请建议一种解决方案

当更改标签文本后出现一定数量的行时,您可以使用switch语句来确定字体大小

使用中的actualNumberOfLines()算法可以在必要时重新声明此标签的字体

func changeFontSizeIfNeeded(on label: inout UILabel){

switch label.actualNumberOfLines{
case 2:
 label.font = label.font.withSize(24)
case 3: 
 label.font = label.font.withSize(20)

default:
//Change this to be the default font size
  label.font = label.font.withSize(30)

}


}
并将此扩展添加到项目中:

extension UILabel{

func actualNumberOfLines()-> Int {
        // You have to call layoutIfNeeded() if you are using autoLayout
        self.layoutIfNeeded()

        let myText = self.text! as NSString

        let rect = CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude)
        let labelSize = myText.boundingRect(with: rect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: self.font as Any], context: nil)

        return Int(ceil(CGFloat(labelSize.height) / self.font.lineHeight))
    }

 }
这与……有关吗?或者,当文本变大时,是否要设置精确的字体大小?