使用不同高度的单元格(如iOS中的Facebook Feed)自定义UITableview

时间:2015-04-16 06:21:17

标签: ios objective-c uitableview

我必须在UITableview中显示列表详细信息。但是对于一些细胞而言列表很小,而对于一些其他细胞则列出大/中等高度。 (喜欢facebook feed)所以Tableview每个细胞都有不同的高度。我怎样才能做到这一点?

列表包含

imageview,2个标签,textview (标签和文本视图的长度也会根据其内容而增加。它也会影响tableview单元格的高度)。因此,实现这一目标的任何帮助都会非常有用。

感谢。

2 个答案:

答案 0 :(得分:0)

#define CELL_MARGIN 10.0f 

-(CGFloat)heightForTableView:(NSString*)text widthOfTableview:(CGFloat)tableViewWidth{
    CGSize constraint = CGSizeMake(tableViewWidth - (CELL_MARGIN * 2), 20000.0f);

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

    CGFloat height = MAX(size.height, 44.0f);

    return height + (CELL_MARGIN * 2);
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [self heightForTableView:cell.titleLabel.text widthOfTableview:CGRectGetWidth(tableView.frame)];// cell.textlable.text is your lable.text
}

此代码可能会帮助您:)

答案 1 :(得分:0)

使用自己的.xib创建您的单元格。根据需要添加标签,textview图像视图等。确保将所有限制水平和垂直限制在单元格的前/后/顶部和底部。

现在的诀窍是告诉autolayout布局单元格的contentView,并返回最小高度以适应其内容。由于在cellForRow中加载单元格之前执行了heightForRow,我们需要使用fakeCell来计算高度。

为此,我们在控制器中有一个tableView,它显示了DetailsTableViewCell类的单元格,并为其创建了一个为其创建的nibThisTableViewCell.xib:

1)在控制器中为fakeCell创建一个@property。

@property (nonatomic, strong) DetailsTableViewCell *fakeCell;

2)在viewDidLoad中,从它们nib初始化它:

self.fakeCell = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass:@"DetailsTableViewCell" owner:nil options:nil].firstObject;

3)在heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    //grab fakeCell, style it with the data you want
    [self.fakeCell styleWithDetails:self.details];
    //and calculate the minimum height required to fit all content
    return [self minimumCellHeightToSatisfyConstraints:self.fakeCell];
}



-(CGFloat)minimumCellHeightToSatisfyConstraints:(UITableViewCell *)cell {
    //Makes sure cell's width is equal to tableView's width (can be wrong since they are in separated nibs)
    cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.tableView.bounds), CGRectGetHeight(cell.bounds));

    //Force autolayout to recalculate all subview's frames
    [cell layoutIfNeeded];

    //Get the minimum height required for the cell to fit all its content
    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return height;
}

重要:如果您忘记将.xib中的所有子视图从上到下垂直固定到单元格,请调用systemLayoutSizeFittingSize:UILayoutFittingCompressedSize将返回0并且不起作用。