自定义UITableviewcell高度未正确设置

时间:2015-04-01 23:29:37

标签: ios objective-c uitableview

我在SO上探讨了关于这个问题的现有Q& As,但没有找到答案。

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

  • 带有标准单元格的标准tableview,在代码中只创建一个(row = 2)作为自定义单元格;

    customCell:

    -(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单元格的内容视图的高度为零的情况。我们正在考虑无意中崩溃并使用标准高度。

screenshot of simulator, see Row 2 got tucked under other rows<code>enter code here</code>

4 个答案:

答案 0 :(得分:5)

几天前我遇到了类似的错误。我建议您再次检查自动布局限制。

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

答案 1 :(得分:4)

您可以在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

答案 2 :(得分:2)

想出来。

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

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

答案 3 :(得分:2)

我刚刚处理过这个问题。我正在从nib文件中执行自定义tableViewCell,而不是使用storyboard单元格。我按照上面的建议添加了代码(Objective-C):

data Foo = One | Two | Three deriving (Show, Read)
data Bar = This | That | TheOther deriving (Show, Read)

doSomething :: Either Foo Bar -> Either Int String
doSomething var = if (typeOf var) == Int then 123 else "string"

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