cell.contentView systemLayoutSizeFittingSize:不适用于动态高度tableview

Posted

技术标签:

【中文标题】cell.contentView systemLayoutSizeFittingSize:不适用于动态高度tableview【英文标题】:cell.contentView systemLayoutSizeFittingSize: does not work for dynamic height tableview 【发布时间】:2014-03-24 22:05:48 【问题描述】:

我尝试在自定义 uitableviewcell 中使用自动布局 并尝试根据这个SO主题实现动态高度

Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

但我的单元格是由 xib 文件创建的。所以方法有些不同 这是我在 heightForRowAtIndexPath 中的代码

   -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  
 myDataItem *item= [[data items] objectAtIndex:[indexPath row]];



   CustomCell *cell = [self.offscreenCells objectForKey:@"CustomCell"];
    if (!cell) 
        cell =  [CustomCell alloc] init];
        [self.offscreenCells setObject:cell forKey:@"CustomCell"];
        



    [cell.commentView setText:item.comment]; 
    [cell.displayNameView setText:item.displayNameOfItemOwner];

    [cell.timeAgoView setText:item.timeAgo];
   [cell.imageView setImage:[UIImage imageNamed:@"sis_profile_placeholder"]];


    cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(_prototypeCell.bounds));

    [cell setNeedsLayout];
    [cell layoutIfNeeded];


    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return height+1; 

我从 [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] 得到的高度总是“nil” " 当我尝试调试时,我发现我的 customcell 的所有子视图都是“nil”,但单元格本身不是“nil”。这可能是因为我的 customCell 是由 nib 制作的,当我执行 [[CustomCell alloc] init] 时,单元格没有完全创建。

但我确实尝试将方法更改为 cell = [_tableView dequeueReusableCellWithIdentifier:@"CustomCell"];

结果还是一样。每个子视图都是 nil 。这使高度返回为零,并使我的 tableView 显示不正确。有没有办法解决这个问题?

我尝试在 AutoLayout 上制作这些。实际上,在以前的版本中,我没有使用 AutoLayout 并手动计算单元格高度。它确实工作得很好。无论如何,我只想尝试 AutoLayout。

请帮忙。在此先感谢

【问题讨论】:

如果您打算从笔尖加载单元格,cell = [CustomCell alloc] init]; 将不起作用。查看this question 了解如何执行此操作。 谢谢。我现在可以从 xib 创建 CustomCell。但是 [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] 仍然返回 nil 该方法的返回类型是 CGFloat,而不是 id,所以它不应该返回 nil。但是,如果它返回 0.0,则您的约束可能有问题。同样,我的建议是在代码中做你的约束,因为它更容易调试和正确。 对不起,我的意思是零。 Cell.contentView systemLayoutSizeFittingSize 不起作用,但是当我更改为 cell.commentView 时,它确实返回了有效值。因为评论视图只是具有动态高度的视图,所以我使用它的返回值来计算 heightForRow 我也遇到了同样的问题,请问您解决了吗? 【参考方案1】:

这是我的解决方案 我分配新单元格 NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; // 获取指向第一个对象的指针(可能是自定义单元格,因为这是 XIB 应该包含的所有内容)。

        cell = [topLevelObjects objectAtIndex:0];

  -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath    *)indexPath
 
 myDataItem *item= [[data items] objectAtIndex:[indexPath row]];



  CustomCell *cell = [self.offscreenCells objectForKey:@"CustomCell"];
if (!cell) 
         NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
 // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).

        cell = [topLevelObjects objectAtIndex:0];

    [self.offscreenCells setObject:cell forKey:@"CustomCell"];
    



[cell.commentView setText:item.comment]; 
[cell.displayNameView setText:item.displayNameOfItemOwner];

[cell.timeAgoView setText:item.timeAgo];
  [cell.imageView setImage:[UIImage imageNamed:@"image"]];


cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(_prototypeCell.bounds));

[cell setNeedsLayout];
[cell layoutIfNeeded];


CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
return height+1; 

【讨论】:

return height +1 用于分隔符。更灵活的方法是CGFloat separator = ((UITableViewCellSeparatorStyleNone != self.tableView.separatorStyle) ? 1 : 0); return height + separator; 【参考方案2】:

据我所知,在 ios 8 下,建议的解决方案不适用于具有多行标签的单元格,因为 systemLayoutSizeFittingSize 不会考虑所需的单元格宽度(简单地说,它会尝试将标签布局到一行,从而使单元格比应有的更宽)。

我设法通过在单元格的contentView 中安装宽度约束而不是设置单元格边界来解决此问题。请记住在调用systemLayoutSizeFittingSize: 后立即卸载此类约束。

【讨论】:

以上是关于cell.contentView systemLayoutSizeFittingSize:不适用于动态高度tableview的主要内容,如果未能解决你的问题,请参考以下文章

[cell addSubview:button] 和 [cell.contentview addsubview:button] 有啥不同

删除 cell.contentview 上的所有子视图,标签除外

cell.contentView systemLayoutSizeFittingSize:不适用于动态高度tableview

Tableview [cell.contentview viewwithtag:] 返回 nil

iPhone:向 Cell ContentView 添加子视图会在滚动时覆盖单元格文本

iOS-iOS uitablecell 怎么设置文字显示区域的宽度