今天做ZrMusic的评论页面的时候需要通过text来自适应Label的高度,用了两种比较好的方法,分享一下

提醒

label的numberOfLines属性要设置为0,即能显示多少行就显示多少行,不然默认是只有一行的

通过textBound的形式

1
2
3
4
5
6
func heightWithText(text:String) -> CGFloat
{
let size:CGRect = text.boundingRect(with: CGSize(width: 100, height: 999.9), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 14)], context: nil)

return size.height
}

可以通过配置参数得到

通过sizeToFit方法

sizeToFit是UIView的一类方法,使其的frame符合contentView的边框

1
2
3
4
5
6
7
8
9
func getSuitableHeight(text: String, fontSize: CGFloat, fontWeight: UIFont.Weight, setWidth: CGFloat) -> CGFloat {
let label = UILabel(frame: CGRect(x: 0, y: 0, width: setWidth, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.font = UIFont.systemFont(ofSize: fontSize, weight: fontWeight)
label.text = text

label.sizeToFit()
return label.bounds.height
}

方法还是很容易看懂的

补充:fontSuitToFrame

这个是自己写的一个方法,利用的是UIView的sizeThatFits方法,简单易懂,其实就是比例缩放

1
2
3
4
5
6
7
8
9
//    根据Frame宽高字体自适应最小宽(高)
func fontSuitToFrame() {
let aView = self.sizeThatFits(CGRect.zero.size)
guard aView.width * aView.height != 0 else { return }
let rate1 = self.frame.width / aView.width
let rate2 = self.frame.height / aView.height
let rate = rate1 > rate2 ? rate2 : rate1
self.font = .systemFont(ofSize: self.font.pointSize * rate)
}