Skip to content

Instantly share code, notes, and snippets.

@fuxingloh
Last active June 4, 2024 08:09
Show Gist options
  • 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

@stefanprojchev
Copy link

stefanprojchev commented Jun 4, 2024

In order to work you must call it after func viewDidLayoutSubviews() was called.
It uses the label frame. In viewDidLoad this value is still not correct which leads to you getting incorrect values.

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