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
.
时似乎没有被正确考虑
将我的约束更改为附加到单元格本身解决了问题。
我正在尝试让我的单元格动态调整大小,我想利用 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
.
将我的约束更改为附加到单元格本身解决了问题。