Skip to content

Instantly share code, notes, and snippets.

@fuxingloh
Last active October 28, 2023 22:36
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save fuxingloh/ccf26bb68f4b8e6cfd02 to your computer and use it in GitHub Desktop.
Save fuxingloh/ccf26bb68f4b8e6cfd02 to your computer and use it in GitHub Desktop.
iOS Swift: How to check if UILabel is truncated? Calculate number of lines for UILabel
func countLabelLines(label: UILabel) -> Int {
// Call self.layoutIfNeeded() if your view uses auto layout
let myText = label.text! as NSString
let rect = CGSize(width: label.bounds.width, height: CGFloat.greatestFiniteMagnitude)
let labelSize = myText.boundingRect(with: rect, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: label.font], context: nil)
return Int(ceil(CGFloat(labelSize.height) / label.font.lineHeight))
}
@chetansrm
Copy link

chetansrm commented Sep 12, 2017

Amazing!!.. I am done.

@harikrishnabista
Copy link

This returned me 11 even for couple of words.

@havdiOS
Copy link

havdiOS commented Jan 18, 2019

This returned me 11 even for couple of words.

Please check the width of UILable. Let fix it. I have also been like you.

@MakCas
Copy link

MakCas commented Apr 5, 2021

Thank you very much! You helped a lot) It works)

@raaowx
Copy link

raaowx commented Jun 16, 2021

Code updated to Swift 5 and made as UILabel extension. Also 0 will be returned if the label doesn't have any text.

extension UILabel {
  func countLines() -> Int {
    guard let myText = self.text as NSString? else {
      return 0
    }
    // Call self.layoutIfNeeded() if your view uses auto layout
    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))
  }
}

Now you can perform something like:

class MyAwesomeViewController: UIViewController {
  @IBOutlet weak var myAwesomeLabel: UILabel!

  override func viewDidLoad() {
    if myAwesomeLabel.countLines() >= 2 {
      // Do some stuff
    }
  }
}

@emrdgrmnci
Copy link

I have 2 lines UILabels but still this extension shows me 1 line

@AbdElrahman-Rafaat-Amer
Copy link

I have 3 lines UILabels but still this extension shows me 1 line

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment