IOS计算自定义单元格的tableview行高

时间:2014-12-01 00:02:58

标签: ios uitableview dynamic height row

我有一个在每个屏幕上都使用tableviews的应用程序。我有很多自定义单元格,每个单元格都有不同的高度。现在计算高度是一个相当大的挑战。我正在寻找一种通用方法,它将返回每个自定义单元格的高度,而不使用heightForRowAtIndex。我之所以不想使用heightForRowAtIndex,是因为我在一个单元格后面有4个xib,而且我不想用 if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) {} 类检查来弄乱这个方法。对于记录单元,xibs是iPhone,iPad,英文和阿拉伯文版本:
cell_en.xib
cell_en〜ipad.xib
cell_ar.xib
cell_ar〜ipad.xib

目前,我正在尝试关注;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
            {
                switch (indexPath.row) {

                case 0:
                {
                    VPCell1 *cell=[VPCell1 cellForTable:tableView withOwner:self];
                    [tableView setRowHeight:CGRectGetHeight(cell.contentView.frame)];
                    return cell;
                }
                case 1:
                {
                    VPCell2 *cell=[VPCell2 cellForTable:tableView withOwner:self];
                    [tableView setRowHeight:CGRectGetHeight(cell.contentView.frame)];
                    return cell;
                }
                case 2:
                {
                    VPCell3 *cell=[VPCell3 cellForTable:tableView withOwner:self];
                    [tableView setRowHeight:CGRectGetHeight(cell.contentView.frame)];
                    return cell;
                }
          }
    }

我在这里使用[tableView setRowHeight:CGRectGetHeight(cell.contentView.frame)]; 为每个单元格设置行高 原来应该使用setRowHeight方法,如果tableview中的所有单元格具有相同的高度,那么绝对不能在这里选择性能优化。我愿意接受解决这个烂摊子的想法。         
谢谢!

3 个答案:

答案 0 :(得分:1)

如果tableview的所有单元格具有相同的高度,则设置tableview rowHeight,但只在加载tableview时设置一次,让我们在控制器viewDidLoad中说。

如果在同一个tableView中有不同高度的单元格,则必须使用heightForRowAtIndexPath。不,它并不痛苦,只是它的设计方式。

答案 1 :(得分:0)

使用iOS8,您可以使用AutoLayout并让UITableView计算行高。要告诉UITableView关于行高的自我估计,你必须在viewDidLoad中写这些行:

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 50.0; // your estimated average cell height

在您的自定义单元格中,您必须覆盖方法" layoutSubviews":

- (void)layoutSubviews
{
    [super layoutSubviews];

    // Make sure the contentView does a layout pass here so that its subviews have their frames set, which we
    // need to use to set the preferredMaxLayoutWidth below.
    [self.contentView setNeedsLayout];
    [self.contentView layoutIfNeeded];


    self.details.preferredMaxLayoutWidth = CGRectGetWidth(self.details.frame);
}

上述方法基于自定义单元格,其中所有元素都放置在内容视图中。此外,所有元素都应使用约束进行管理。

在github上查看我的Example Project

答案 2 :(得分:0)

UITableView.AutomaticDimension本身并不适合我。

我还必须申请

uiDescription.SetContentCompressionResistancePriority(1000, UILayoutConstraintAxis.Vertical);

到我希望视图扩展其内容的元素