Archive for 27th May 2011

UILabel sizeToFit malfunction

For some reason, my use of UIView’s sizeToFit method was not working as expected. What I got when I tried to send my UILabel controls through this method was that they ended up being sized down too far, and as a result text was either eliminated from the label, or an ellipsis appeared at the end. I tried just about every combination of UILineBreakMode and numberOfLines I could think of, with no combination fixing the problem.

So what I ended up doing was to just manipulate the UILabel’s frame in the table view’s cellForRowAtIndexPath method. Here is a code snippet:

if (feedIndex == SECTION_CUSTOMER_AND_JOB_INFO) 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_CUSTOMER_AND_JOB_INFO];
 
    if (cell == nil) 
    {
        [[NSBundle mainBundle] loadNibNamed:@"SummaryCustomerAndJobInfoCell" owner:self options:NULL];
        cell = cellCustomerAndJobInfo;
    }
 
    // the next line uses the tag property of the label as set in the nib file
    UILabel *lbl = (UILabel *)[cell viewWithTag:1];
 
    NSString *text = @"Set your multiple line\ntext to display here...";
    CGSize constraint = CGSizeMake(lbl.frame.size.width, 20000.0f);
    CGSize size = [text sizeWithFont:lbl.font constrainedToSize:constraint
                       lineBreakMode:UILineBreakModeWordWrap];
 
    lbl.text = text;
    [lbl setFrame:CGRectMake(lbl.frame.origin.x, lbl.frame.origin.y, 
                                      lbl.frame.size.width, size.height)];
 
    return cell;
}

By the way, don’t forget to do the same kind of size calculations in your heightForRowAtIndexPath delegate method.

This past Wednesday was a day of great sadness for me, as I had to put my 15 year old schipperke to sleep. Good bye Captain Kirk, you were an ornery little cuss but we loved you anyway. :'(