Dynamic height for UILabel to fit to content length

Starting with objective-c for iOS is a big step, when you come from the always dynamic “web”-world with HTML and CSS. Just put content in some HTML Tag and it normally grows with the length of it.

With objective-c and iOS a lot things are just different, like the elements you can choose to put content in, or the way navigation works.
One common problem – especially for beginners – is to accept that you have to calculate sizes for elements programmatically, e.g. UILabel.
When we use the interface builder, there are controls for that, but this is all static so far, e.g. “Lines”.

So how can i resize the UILabel if i do not know the content length?
It is not as complicated as it seems in the first place.

Bildschirmfoto 2013-05-01 um 11.16.47

If you use the Interface Builder and put a UILabel in your layout it is important to set “Lines” to 0. i often forgot this, so i think its guess is a common mistake, this is why i point it out 😉

Now we fill the UILabel (here: publicTransport) with a value from a NSDictionary and resize it to the necessary size.

publicTransport.text = [addresslist valueForKey:@"public"];
NSString *message = [addresslist valueForKey:@"public"]; 
CGSize maximumLabelSize = CGSizeMake(280,1000);

// use font information from the UILabel to calculate the size
CGSize expectedLabelSize = [message sizeWithFont:publicTransport.font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];

// create a frame that is filled with the UILabel frame data
CGRect newFrame = publicTransport.frame;

// resizing the frame to calculated size
newFrame.size.height = expectedLabelSize.height;

// put calculated frame into UILabel frame
publicTransport.frame = newFrame;

Just copy this code and paste it into your project. Replace the label name publicTransport with the label name you need to resize and this should all work fine 😉