vote up 10 vote down star
13

This is on iPhone 0S 2.0. Answers for 2.1 are fine too, though I am unaware of any differences regarding tables.

It feels like it should be possible to get text to wrap without creating a custom cell, since a UITableViewCell contains a UILabel by default. I know I can make it work if I create a custom cell, but that's not what I'm trying to achieve - I want to understand why my current approach doesn't work.

I've figured out that the label is created on demand (since the cell supports text and image access, so it doesn't create the data view until necessary), so if I do something like this:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

then I get a valid label, but setting numberOfLines on that (and lineBreakMode) doesn't work - I still get single line text. There is plenty of height in the UILabel for the text to display - I'm just returning a large value for the height in heightForRowAtIndexPath.

flag

71% accept rate

3 Answers

vote up 10 vote down check

Here is a simpler way, and it works for me:

Inside your cellForRowAtIndexPath .... function. The first time you create your cell:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
	cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
	cell.textLabel.numberOfLines = 0;
	cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

You'll notice that I set the number of lines for the label to 0. This lets it use as many lines as it needs.

The next part is to specify how large your UITableViewCell will be, so do that in your heightForRowAtIndexPath function:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellText = @"Go get some text for your cell.";
UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

return labelSize.height + 20;
}

I added 20 to my returned cell height because I like a little buffer around my text.

link|flag
2  
You do not need to set your cell.textLabel.numberOfLines to some arbitrarily high number. Setting it to 0 means "as many lines as it takes to display." – mmc Jun 7 at 15:07
Thanks, I'll edit my post tonight after I get a chance to verify it in my own project. – Tim Rupe Jun 8 at 15:58
Setting number of lines to 0 works fine (as many lines as it takes to display) – Prakash Jun 17 at 4:57
Thanks. I made the correction. – Tim Rupe Jun 18 at 14:34
vote up 2 vote down

I don't think you can manipulate a base UITableViewCell's private UILabel to do this. You could add a new UILabel to the cell yourself and use numberOfLines with sizeToFit to size it appropriately. Something like:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
link|flag
vote up 1 vote down

Add your own UILabel as a subview of the cell.contentView view.

link|flag
Doesn't answer the question! Does answer the title of the question though, which I have now edited. – Airsource Ltd Sep 28 '08 at 15:13

Your Answer

Get an OpenID
or

Not the answer you're looking for? Browse other questions tagged or ask your own question.