【问题标题】:custom UITableviewcell height not set correctly自定义 UITableviewcell 高度未正确设置
【发布时间】:2015-06-06 19:10:21
【问题描述】:

我探索了关于这个问题的现有问答,但没有找到我的答案。

我知道这是由于 tableview 在运行时不知道自定义单元格的高度造成的,但不知道如何克服这个问题。这是 iOS 8 + Xcode 6。我为自定义单元格的固有大小完成了所有自动布局所需的方法...

  • 带有标准单元格的标准表格视图,仅在代码中创建一个(行 = 2)作为自定义单元格;

    自定义单元格:

    -(CGSize)intrinsicContentSize
    

    { //用于测试目的的硬代码

    return CGSizeMake(500.0, 450.0);
    

    }

  • 在iOS模拟器上运行时,发现customCell显示在其行下方的其他单元格“下方”,具有高度标准,与其他标准单元格高度的设置方式相同,而不是其高度设置得比其他单元格大得多细胞。

在表格视图控制器中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell;
    pageViewCellTableViewCell* customCell;

    if (indexPath.row != 2)
    {
       cell = [tableView dequeueReusableCellWithIdentifier:@"regularCell" forIndexPath:indexPath];


        cell.textLabel.text = [NSString stringWithFormat:@"Table Row %lu", indexPath.row];
        return cell;
    }
    else
    {
        customCell = [tableView dequeueReusableCellWithIdentifier:@"customCell"] ;

        if (customCell == nil) {

            customCell = [[customCell alloc] init];

        }

        customCell.parentViewController = self;


        [customCell  setNeedsUpdateConstraints];
        [customCell setNeedsLayout];
        [customCell setNeedsDisplay];


        return customCell;

    }

    return nil ;
}

- (CGFloat)tableView: (UITableView*)tableView EstimatedHeightForRowAtIndexPath: (NSIndexPath*) indexPath
 {
     if (indexPath.row != 2)
         return 10;
     else
         return 450;
 }

 - (CGFloat)tableView: (UITableView*)tableView HeightForRowAtIndexPath: (NSIndexPath*) indexPath
 {
     if (indexPath.row != 2)
         return 10;
     else
         return 450;
 }

在模拟器上运行时:

收到以下错误消息: 仅警告一次:检测到约束模糊地建议 tableview 单元格的内容视图高度为零的情况。我们正在考虑意外折叠并改用标准高度。

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案1】:

    几天前我遇到了类似的错误。我建议您再次检查 Auto Layout 约束。

    设置tableView.rowHeight = UITableViewAutomatic 时,您必须确保单元格中的每个元素都有前导、顶部和底部约束。否则 swift 无法根据内容大小动态更改高度。

    【讨论】:

    • 这有帮助 - 调整约束的优先级(并使用
    【解决方案2】:

    您可以在 iOS 8(Swift 代码)中使用自动调整大小的单元格:

    tableView.estimatedRowHeight = 88.0
    tableView.rowHeight = UITableViewAutomaticDimension
    

    下面列出了两个教程:

    1. Understanding Self Sizing Cells and Dynamic Type in iOS 8
    2. iOS 8: Self Sizing Table View Cells with Dynamic Type

    【讨论】:

      【解决方案3】:

      想通了。

      根据 WWDC 2014 视频“Tableview 和 Collection View 的新功能”:

      1. 添加了从 self.view 到 customTableViewCell.contentView 的约束
      2. 将 intrinsicSize 设置为 self.bounds.size

      【讨论】:

        【解决方案4】:

        我也刚刚处理了这个问题。我正在从一个 nib 文件而不是使用情节提要单元格做一个自定义 tableViewCell。我按照上面的建议添加了代码(Objective-C):

        self.tableView.rowHeight = UITableViewAutomaticDimension;
        [self.tableView setEstimatedRowHeight:85.0];
        

        没有帮助。 做了 帮助解决了我的限制。我假设通过固定到顶部,然后设置下两个对象之间的垂直间距就足够了。我还为 UILabel 设置了一个固定的高度约束,认为这会有所帮助。它没有。删除任何固定高度约束并将底部对象固定到容器底部解决了我的问题。事实证明,自动布局比我更聪明。谁知道!?哈哈

        【讨论】:

          【解决方案5】:

          我一直在努力解决 UITableViewCell 使用 2 个标签垂直压缩的问题。

          如 Mike C. 所述,设置容器的底部间距 - 对我来说也是如此。

          右键单击并从标签边界框的左侧(外部标签边界框,而不是标签名称本身)拖动到内容视图的左下方,打开约束视图。选择“容器底部空间” - 瞧。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多