创建的单元格应该比它更宽。

时间:2014-03-20 19:37:31

标签: ios objective-c uitableview

我正在创建一个单元格:

-(AnswerTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    AnswerTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[AnswerTableViewCell alloc] initWithFrame:CGRectMake(0, 0, self.answersTable.frame.size.width, [self tableView:nil heightForRowAtIndexPath:indexPath])];
    }

NSLog(@"cell.frame - %@", NSStringFromCGRect(cell.frame));
NSLog(@"self.answersTable.frame - %@", NSStringFromCGRect(self.answersTable.frame));


    AnswerObject* answer = self.question.answers[indexPath.row];

    CGFloat height = [self tableView:nil heightForRowAtIndexPath:indexPath];
    [cell setupAnswerTableViewCell:self.question answer:answer row:indexPath.row height:height];

    return cell;
}

我只看到一半。

当我打印单元格和表格框架时,我可以看到表格比单元格更细。怎么回事?

2014-03-20 21:36:22.478 Theory[43601:60b] cell.frame - {{0, 0}, {320, 44}}
2014-03-20 21:36:22.479 Theory[43601:60b] self.answersTable.frame - {{20, 38.880001068115234}, {280, 500}}

2 个答案:

答案 0 :(得分:0)

可能不是tableViewCell错误的框架,而是tableview。如果是UITableView,则其rows的宽度始终与tableView自身的宽度相同。

顺便说一句,你真的不应该使用initWithFrame:reuseIdentifier:,因为它被弃用了。 (尤其不是nitWithFrame:方法,cell如何了解其reuseIdentifer?)如果您是以编程方式创建单元格,则应使用initWithStyle:reuseIdentifier:

同时致电

[self tableView:nil heightForRowAtIndexPath:indexPath]
tableView:cellForRowAtIndexPath中的

是非常错误的。如果你在参数中传递tableView,它将导致无限循环,这可能是你传递nil的原因。您可以将tableView:heightForRowAtIndexPath中的代码提取到单独的方法中并在两种情况下调用。但是你真的应该相信你的cell根据height来调整其内容的布局,所以你真的不应该处理 cell {{1} } frame方法。

答案 1 :(得分:0)

您应该使用此初始化程序

创建单元格
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 

这是单元格中的常用init,因此您不需要框架。

//您需要从答案文本中获取单元格高度,并在此方法中将其作为CGFloat返回(类似于此示例)

-(CGFloat)getAnswerHeightForCell:(Aswer *)answer {
       NSString *text = answer.text;
       CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)];

      return textSize.height ;
}

在tableView的dataSource和delegate方法中,您需要添加单元格的高度并创建单元格。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
     Answerobject * answer = [self.question.answers[indexPath.row];
     CGFloat answeSize = [self getAnswerHeightForCell:answer ];

     return textSize.height + SOME_EXTRA_HEIGHT_FOR_PADDING;
}


-(AnswerTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    AnswerTableViewCell *cell =( AnswerTableViewCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[LZCommentCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    }

    AnswerObject* answer = self.question.answers[indexPath.row];


    [cell setupAnswerTableViewCell:self.question answer:answer row:indexPath.row];

    return cell;
}