iOS动态高度UITableViewCell和heightForRowAtIndexPath

时间:2015-07-10 08:55:00

标签: ios objective-c iphone uitableview

我在一个大项目中使用Autolayout作为我的新UITableViewCells。

我有一个TableView,其中每行的高度是自动计算的,我不使用委托函数heightForRowAtIndexPath

我已经宣布估计行高:

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

我的问题是:在另一个TableViewController上有很多UITableViewCells,我在编程上需要在heightForRowAtIndexPath中声明单元格的高度。我知道将所有单元格转换为使用唯一解决方案会更好,但在这个项目中有很多不同的单元格,所以我想使用一种解决方法并将动态计算的高度与自动布局和编程计算的行相结合高度。

这可能吗?

3 个答案:

答案 0 :(得分:20)

如果您使用的是iOS 8及更高版本,则无需动态计算高度。自动布局将为您完成所有工作。但如果使用低于IOS 8,则需要计算单元格高度。

对于IOS 8:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}

并在控制器中添加以下代码:

tableView.estimatedRowHeight = 400.0
tableView.rowHeight = UITableViewAutomaticDimension

estimatedRowHeight应该是您的单元格的最大高度。

由于

答案 1 :(得分:1)

使用boundingRectWithSize动态计算内容的高度。 如果您的UILabel是动态的,则可以使用以下内容:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

   /* Check Content Size and Set Height */
    CGRect answerFrame = [YOUR_LABEL.text boundingRectWithSize:CGSizeMake(240.f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:[UIFont fontWithName:@"" size:14.0f]} context:nil];

    CGSize requiredSize = answerFrame.size;

    return requiredSize.height;
}

答案 2 :(得分:0)

你可以试试这个。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
     int topPadding = cell.yourLabel.frame.origin.x;
     int bottomPadding = cell.frame.size.heigth-(topPadding+cell.yourLabel.frame.size.height);
     NSString *text = [DescArr objectAtIndex:[indexPath row]];
     CGSize maximumSize = CGSizeMake(cell.yourLabel.frame.size.width, 9999);
     CGSize expectedSize = [text sizeWithFont:yourCell.yourLabel.font constrainedToSize:maximumSize lineBreakMode:yourCell.yourLabel.lineBreakMode];

     return topPadding+expectedSize.height+bottomPadding;
}