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

时间:2014-03-24 22:05:49

标签: ios objective-c uitableview autolayout

我尝试在自定义uitableviewcell中使用autolayout 并尝试根据此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]获得的高度总是“无” “ 当我尝试调试时,我发现我的customcell的所有子视图都是“nil”,但是单元格本身并不是“nil”。这可能是因为我的customCell是由nib创建的,当我[[CustomCell alloc] init]时,单元格没有完全创建。

但我确实尝试将方法改为cell = [_ tableView dequeueReusableCellWithIdentifier:@“CustomCell”];

结果仍然相同。每个子视图都是零。这使得高度返回为零并且使得我的tableView显示不正确。有什么方法可以解决这个问题吗?

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

请帮助。谢谢提前

2 个答案:

答案 0 :(得分:1)

这是我的解决方案 我分配新的细胞 NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@" CustomCell"所有者:自我选择:无;      //抓住指向第一个对象的指针(可能是自定义单元格,因为所有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; }

答案 1 :(得分:0)

据我所知,在iOS 8下,所提出的解决方案不适用于具有多行标签的单元格,因为systemLayoutSizeFittingSize不会考虑所需的单元格宽度(简单地说,它会尝试布局标记成一行,从而使细胞比它应该更宽。

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