iOS 8 个自调整大小的单元格 - 错误计算的标签高度和无限滚动

iOS 8 self-sizing cells - wrongly calculated height for labels and Infinite scrolling

我正在尝试让我的单元格动态调整大小,我想利用 iOS 8 中新的自调整单元格。现在,我对 superview 的边缘设置了约束,单元格真正调整了自己的大小.问题是单元格有时高度错误,文本没有全部显示。如果文本更长,标签高度的错误也更大。我正在试验问题是否是由新添加的边距引起的,但它也不起作用。

当我尝试用旧方法调整大小时,我发现 cell.contentView.systemLayoutSizeFittingSize 也给出了错误的高度。 table 视图单元格中内容视图的大小时可能缺少一些东西,但我不知道它是什么。

我准备了调整文本和图像大小的工作示例,供您测试:

https://dl.dropboxusercontent.com/u/35953801/Cell%20test.zip

编辑:

还有一个问题,当我尝试实现无限滚动时,reloadTable 总是将它滚动到顶部。当我尝试改用 insertRowsAtIndexPaths 时,它开始跳到错误的位置并出现非常严重的故障。

这是要测试的更新代码:

https://dl.dropboxusercontent.com/u/35953801/Cell%20test2.zip

编辑 2:

正如@gabbler 所建议的那样,实现可靠的无限滚动的最佳方法是采用旧方法。我还没有找到如何使用故事板原型单元格在 heightForRow 方法中测量它们的方法。如果你尝试这样的事情,你会陷入无限循环,因为 dequeReusableCell 实际上调用了 heightForRow:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        var cell = tableView.dequeueReusableCellWithIdentifier("CellProgrammatical", forIndexPath: indexPath) as TableViewCell

可能可以使用单元格的 Nib 资源设置它,但最好可能是为了避免让自己头疼,请遵循 https://github.com/smileyborg/TableViewCellWithAutoLayout 并以编程方式设置约束。

iOS8 需要做一件事。它最初将额外的约束 UIView-Encapsulated-Layout-Height 添加到 44,如果单元格高于该值,则会破坏单元格。有必要将所有垂直约束设置为较低优先级 (999)。

这里又是一个例子,无限滚动:

https://dl.dropboxusercontent.com/u/35953801/Cell%20test3.zip

感谢帮助

您的单元格中有一个标签设置了首选宽度,删除该设置似乎可以解决问题。

既然你已经让标签宽度与单元格宽度相等,那么就没有必要设置Preferred Width.

并尝试删除这些代码。

self.tableView.estimatedRowHeight = 600;
tableView.reloadData() 

这里好像是多余的

我用下面的代码来计算身高 这里 20 是我的字体大小

UIFont *font = [UIFont systemFontOfSize:20];
NSDictionary *userAttributes = @{NSFontAttributeName: font,
                                     NSForegroundColorAttributeName: [UIColor blackColor]};
    NSString *text = self.userModel.quote;

    CGSize textSize = [text sizeWithAttributes: userAttributes];

    ht = 20;

    if (textSize.width > [FunctionUtils getViewWidth]) {

        ht = (textSize.width/([FunctionUtils getViewWidth]));
        ht = (ceil(ht))*20+35;

    }

FWIW 当我在标签和单元格 margins 而不是单元格本身之间设置约束时,我遇到了这个问题。边距很奇怪,在计算 preferredMaxLayoutWidth.

时似乎没有被正确考虑

将我的约束更改为附加到单元格本身解决了问题。