UILabel get the displayed font size when adjustsFontSizeToFitWidth is YES

Turns out it is a bit more complex since iOS 7 deprecated the useful sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:, as used in the suggested duplicate.

We now have to use NSAttributedString instead.

Create an NSAttributedString from the string to be / that is set on the label. Setting the entire attributed string's font to whatever the label's font is.

NSDictionary *attributes = @{NSFontAttributeName : self.label.font};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text
                                                                       attributes:attributes];

Then, create a NSStringDrawingContext object, configured to use the minimum scale factor of the label. This will be used to assist in the calculation of the actual font size.

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
context.minimumScaleFactor = self.label.minimumScaleFactor;

We can then use the NSAttributedString method to calculate the bounding rect, and further configure the NSStringDrawingContext:

[attributedString boundingRectWithSize:self.label.bounds.size
                               options:NSStringDrawingUsesLineFragmentOrigin
                               context:context];

This will make a drawing pass and the context will be updated to include the scale factor that was used in order to draw the text in the space available (the label's size).

Getting the actual font size is then as simple as:

CGFloat actualFontSize = self.label.font.pointSize * context.actualScaleFactor;

Tags:

Ios

Uikit

Uilabel