You should calculate the number of lines by generating a UILabel
with the same text formatting parameters and calculate its actual number of lines, described here.
With regular text:
let preferredMaxWidth: CGFloat = <maximum width of the label>
let label = UILabel()
label.text = lb.text
label.font = UIFont(name: lb.fontName, size: lb.fontSize)
label.numberOfLines = lb.numberOfLines
label.frame.size.width = preferredMaxWidth
label.sizeToFit()
label.frame.size.width = preferredMaxWidth
let numberOfLines = Int(label.frame.size.height / label.font.pointSize)
With attributed text (if it only uses one type of font):
let preferredMaxWidth: CGFloat = <maximum width of the label>
let label = UILabel()
label.attributedText = lb.attributedText
label.numberOfLines = lb.numberOfLines
label.frame.size.width = preferredMaxWidth
label.sizeToFit()
label.frame.size.width = preferredMaxWidth
guard let pointSize = (lb.attributedText.attributes(at: 0, effectiveRange: nil)[.font] as? UIFont)?.pointSize else {
return
}
let numberOfLines = Int(label.frame.size.height / pointSize)