今天做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
| 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) }
|