iOS 8自定义单元格 - 错误计算标签高度和无限滚动

时间:2015-01-14 08:52:07

标签: ios uitableview ios8

我正在尝试让我的单元格动态调整大小,我想利用iOS 8中新的自调整单元格。现在,我将约束设置为superview的边缘,并且单元格确实调整了自身的大小。问题是单元格有时有错误的高度,文本不会全部显示。如果文字较长,标签高度的错误也会更大。我正在试验这个问题是不是由新增加的边距引起的,但它也不起作用。

当我尝试调整旧方法的大小时,我发现cell.contentView.systemLayoutSizeFittingSize也给出了错误的高度。在表视图单元格中调整内容视图时可能会出现一些问题,但我无法弄清楚它是什么。

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

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

编辑:

还有一个问题,当我尝试实现无限滚动时,reloadTable总是将其滚动到顶部。当我尝试使用insertRowsAtIndexPaths时,它开始跳到错误的位置并且非常糟糕。

以下是测试的更新代码:

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

编辑2:

正如@gabbler建议的那样,实现可靠无限滚动的最佳方法是以旧方式进行。我还没有找到如何使用storyboard原型单元格在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需要做一件事。它最初会向44添加额外约束UIView-Encapsulated-Layout-Height,如果它高于该值,则会破坏单元格。有必要将所有垂直约束设置为较低优先级(999)。

这是一个例子,工作无限滚动:

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

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

FWIW当我在标签和单元格边距之间设置约束而不是单元格本身时,我遇到了这个问题。边距很奇怪,在计算preferredMaxLayoutWidth时似乎没有正确考虑。

更改我要附加到单元格的约束可以解决问题。

答案 1 :(得分:0)

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

由于您已经使标签宽度与单元格宽度相等,因此无需设置首选宽度

并尝试删除这些代码。

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

这似乎是多余的。

答案 2 :(得分:-1)

我使用以下代码计算高度 这里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;

    }