NSAttributedString ignores Autoshrink and numberOfLines for UILabel (iOS 6)

23,205

Solution 1

I found a way to do this:

label.adjustsFontSizeToFitWidth = true
label.attributedText = attributedString
label.lineBreakMode = .ByTruncatingTail // this did the trick!

It only works if the third line is set after setting the attributed string. It seems like the attributed string overrides line break behavior when set (among other things).

Solution 2

minimumFontSize is deprecated as of iOS6. Additionally, adjustsFontSizeToFitWidth only works when numberOfLines is set to 1. UILabel will not resize text across multiple lines because there is ambiguity around handling line breaks while shrinking the font.

Use minimumScaleFactor to set the smallest size that the text should be scaled.

The following code will populate a UILabel with attributed string of font size 20, and scale it down by half to a minimum size of 10.

self.label.lineBreakMode = NSLineBreakByTruncatingTail;
NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"Presenting the great... Hulk Hogan! Presenting the great... Hulk Hogan! Presenting the great... Hulk Hogan! Presenting the great... Hulk Hogan! Presenting the great... Hulk Hogan! Presenting the great... Hulk Hogan! Presenting the great... Hulk Hogan!"];
[hogan addAttribute:NSFontAttributeName
              value:[UIFont systemFontOfSize:20.0]
              range:NSMakeRange(0, [hogan length])];
[self.label setAttributedText:hogan];
self.label.adjustsFontSizeToFitWidth = YES;
self.label.numberOfLines = 1;
self.label.minimumScaleFactor = 0.5;
Share:
23,205
Sergey  Pekar
Author by

Sergey Pekar

Updated on July 09, 2022

Comments

  • Sergey  Pekar
    Sergey Pekar almost 2 years

    I have UILabel with number of lines = 2 system font size = 15 minimum font size = 8 Line break mode - Truncate tail

    When I set long text which have type NSString for UILabel it works fine and shows multiline text (scaled if needed). When I am trying to set text with type NSAttributedString it ignores minimum font size and Autoshrink so I see one line text with maximum font size.

    Is it possible to solve this problem

    Looks something like this (Label size is const)

    -----------------------
    | normal NSString  Text|
    | very  very  long ... | 
    -----------------------
    
    ---------------------------
    |NSAttributedString tex...|
    ---------------------------
    
  • Bagusflyer
    Bagusflyer almost 10 years
    Should numberOfLines = 0 for multiple lines?
  • Kamran Khan
    Kamran Khan almost 9 years
    adjustsFontSizeToFitWidth works with multiple lines as well. However, it doesn't work with attributed strings in multiple lines.
  • TomSawyer
    TomSawyer about 8 years
    Doesn't work if i append other nsattributed string with alignment right
  • Fabio Napodano
    Fabio Napodano almost 8 years
    even if not using adjustsFontSizeToFitWidth, it works only if you set lineBreakMode after having set the attributedText. thanks for sharing!
  • leanne
    leanne over 6 years
    Works with attributes in NSMutableAttributedString, too: set up the attributed string first; THEN add the attributes, including the linebreak mode last in the attribute dictionary.
  • Mariam K.
    Mariam K. about 6 years
    @TomSawyer setting .byTruncatingMiddle worked for me, .ByTruncatingTail was still truncating text at the end
  • Bhavin Chauhan
    Bhavin Chauhan almost 6 years
    @Julian B not work for me used [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html] for NsAttributedString
  • Faris Muhammed
    Faris Muhammed almost 5 years
    The same issue faced in Xcode 10.1 also, thanks for your help
  • Mohsin Khubaib Ahmed
    Mohsin Khubaib Ahmed over 4 years
    @KamranKhan what would one have to do to adjust line spacing for multiple lines as well as minimumScaleFactor ? Any idea?