UITableViewCell with dynamic height iOS
I have implemented TableView with CustomCell in my app,
I want dynamic height of my UITableViewCell
according to text length in UITableViewCell
,
here is the snapshot of Customcell
:
and here is the snapshot of my UITableView
:
code snippet for heightForRowAtIndexPath
#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 10.0f
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSString *text = [DescArr objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 100.0);
return height;
}
As you can see in the 2nd image, height for cell is fixed, it doesn't change with it's text (content) size.
Where am I making mistake? How can I make a a label or a cell to update its size according to its contents/text?
Solution 1:
Please, Look HERE - Dynamic Table View Cell Height and Auto Layout tutorial.
What you need:
- set required constraint on elements in cell (make shure that all done correctly, if no - you can get a lot of problem). Also make shure that you set IntrinsicSize to PlaceHolder value
- add few method for calculating size of cell
Methods:
//this will calculate required height for your cell
-(CGFloat)heightForBasicCellAtIndexPath:(NSIndexPath *)indexPath {
static UIYourClassCellName *sizingCell = nil;
//create just once per programm launching
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = [self.tableView dequeueReusableCellWithIdentifier:@"identifierOfCell"];
});
[self configureBasicCell:sizingCell atIndexPath:indexPath];
return [self calculateHeightForConfiguredSizingCell:sizingCell];
}
//this method will calculate required height of cell
- (CGFloat)calculateHeightForConfiguredSizingCell:(UITableViewCell *)sizingCell {
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height;
}
And call
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self heightForBasicCellAtIndexPath:indexPath];
}
Configuration of cell
- (void)configureBasicCell:(RWBasicCell *)cell atIndexPath:(NSIndexPath *)indexPath {
//make some configuration for your cell
}
After all operation i got next (text inside cell only as placeholder):
Solution 2:
The following code worked fine for me.Try with this
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat lRetval = 10;
CGSize maximumLabelSize = CGSizeMake(231, FLT_MAX);
CGSize expectedLabelSize;
CGFloat numberoflines = [thirdcellText length]/17.0;
if (indexPath.section == 0) {
expectedLabelSize = [firstcellText sizeWithFont:[UIFont systemFontOfSize:16.0]
constrainedToSize:maximumLabelSize
lineBreakMode:NSLineBreakByWordWrapping];
lRetval = expectedLabelSize.height;
}
else if(indexPath.section == 1)
{
expectedLabelSize = [secondcellText sizeWithFont:[UIFont systemFontOfSize:16.0]
constrainedToSize:maximumLabelSize
lineBreakMode:NSLineBreakByWordWrapping];
lRetval = expectedLabelSize.height;
}
else if (indexPath.section == 2)
{
expectedLabelSize = [thirdcellText sizeWithFont:[UIFont systemFontOfSize:16.0]
constrainedToSize:CGSizeMake(231, numberoflines*17.0)
lineBreakMode:NSLineBreakByWordWrapping];
lRetval = expectedLabelSize.height-128.0;
}
UIImage *factoryImage = [UIImage imageNamed:NSLocalizedString(@"barcode_factory_reset.png", @"")];
CGFloat height = factoryImage.size.height;
if (lRetval < height) {
lRetval = height+15.0;
}
return lRetval;
}
Try to add the following code in your customcell class autolayout method
textview.frame = frame;
CGRect frame1 = textview.frame;
frame1.size.height = textview.contentSize.height-2;
textview.frame = frame1;
textview.contentSize = CGSizeMake(textview.frame.size.width, textview.frame.size.height);
labelPtr.frame = CGRectMake(CGRectGetMinX(imageView.frame)+CGRectGetMaxX(imageView.frame)+5.0, textview.frame.size.height+10.0, 140, 16.0);
[labelPtr setNeedsDisplayInRect:labelPtr.frame];
Try to set the label properties like the following
labelPtr = [[UILabel alloc] initWithFrame:CGRectZero];
labelPtr.backgroundColor =[UIColor clearColor];
[labelPtr setNeedsLayout];
[labelPtr setNeedsDisplay];
[self.contentView addSubview:labelPtr];
Solution 3:
A'm looking for a long time how to determinate cell height properly, - looks like - it's a best solution, boundingRectWithSize and constrainedToSize often incorrectly calculated text height, you need to create UILabel than use sizeThatFits function, see below
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(8, 5, celllabelWidth, 9999)];
label.numberOfLines=0;
label.font = [UIFont fontWithName:fontName size:textSize];
label.text = @"celllabelTextHere";
CGSize maximumLabelSize = CGSizeMake(celllabelWidth, 9999);
CGSize expectedSize = [label sizeThatFits:maximumLabelSize];
return expectedSize.height;
}