How to tell when a UILabel will be truncated an/or its line break position will change
cocoa-touch, ios, objective-c, uilabel, uiview
Solution
Swift 3 solution
You can count the number of lines after assigning the string and compare to the max number of lines of the label.
import Foundation
import UIKit
extension UILabel {
func countLabelLines() -> Int {
// Call self.layoutIfNeeded() if your view is uses auto layout
let myText = self.text! as NSString
let attributes = [NSFontAttributeName : self.font]
let labelSize = myText.boundingRect(with: CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil)
return Int(ceil(CGFloat(labelSize.height) / self.font.lineHeight))
}
func isTruncated() -> Bool {
if (self.countLabelLines() > self.numberOfLines) {
return true
}
return false
}
}
Problem
I have a multi-line `UILabel` (`numberOfLines` = 0). It's width can change at runtime, and sometimes this leads to truncation and/or re-wrapping. Some examples illustrate this best: Example 1: the reduction in width leads to a different line break point Example 2: the reduction in width leads to truncation Example 3: the reduction in width leads to both truncation and a different line break position Example 4: the reduction in width does not have any effect on truncation or line break position Since this change in formatting can be quite jarring, I intend to mask it behind some animation (probably a fade in/fade out). However, the first hurdle is identifying when I need to do this. I don't want to apply the animation whenever the label re-sizes - only when it will cause a change in either truncation or line break positions. How might I test this? The test should return YES for example 1, 2, and 3, but NO for example 4. Note: the resizing will never alter the number of lines in my example. Note 2: if anyone has some better tags related to text formatting I'd love to know them - feel free to edit. Note 3: if you are interested in seeing this behavior accomplished, try Apple's mail.app on the iPhone. When viewing the inbox, swipe an email and watch the summary line fade-in/out as it re-wraps and/or truncates (but not when it doesn't need to).