views:

84

answers:

2

I have UILabel, which contains dynamic text. Sometimes text is too long to be shown and thus automagically truncated. How do I find out width of the visible part of truncated text?

sizeThatFits returns length of untruncated text, so at the moment I can only detect when truncation will be done. Need to know how much is visible, including those three dots. Any tips?

Clarification: when text is truncated, it's usually shorter than UILabel width.

+3  A: 

I don't understand why the width would be different that the width of the UILabel if the text is being truncated. Regardless, you can use sizeWithFont:constrainedToSize: to calculate the size of a string with a given font but limited to a "constraining size".

Robot K
Because width of truncated text can be less! Wouldn't ask, if it was same as UILabel width. Font size is fixed to 15, but will check if sizeWithFont will give something else than sizeThatFits.
JOM
UILabel width 205, single row. sizeThatFits is 291, sizeWithFont:constrainedToSize is 163, sizeWithFont:constrainedToSize:lineBreakMode is 203, sizeWithFont:forWidth:lineBreakMode is 203. Thanx for pointing out difference between "163" and "203" solutions!
JOM
+2  A: 

Robot K is correct.

If I was you I'd do the following:

  UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 24)];
  label.text = @"this is some really long text that i want in a small label";
  [view addSubview:label];

  CGSize size = [label.text sizeWithFont:label.font constrainedToSize:label.frame.size  
                 lineBreakMode:label.lineBreakMode];

This should give you a value less than 200 (taking into account the constrained max size and truncation method).

Luke
Robot K is right for multirow case, but my problem was single row. You were the one to mention lineBreakMode, which in addition is also a generic solution. Thanx!
JOM