摘要
调整和重新加载tableView中的行,其中每个单元格都具有由约束计算的动态高度,导致许多其他单元格不必要地重新计算。我该怎么解决这个问题?
可以找到示例项目here。
长版
我有一个视图,显示公司和可变数量的单元格(或卡)的详细信息以及更详细的信息。我在具有动态大小的单元格的UITableViewController中实现了这一点,使用了自动布局约束(主要由this Ray Wenderlich tutorial帮助)。
视图具有以下具有可变高度的单元格:
“关于卡片”可能有也可能没有标题图片,可以展开以显示整个文字。
目前我遇到了四个问题:
animating: true
推送UITableViewController。但是,tableView从导航栏后面开始,并在完成动画时跳转。不知道为什么。更新这似乎不会持续发生。喜悦。
使用以下代码更新单元格:
func organizationRequestsUpdated() {
self.tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: UITableViewRowAnimation.None)
}
点击关于卡片应该展开它。我目前通过在单元格启动时设置label.numberOfLines = 5
并使用它来切换扩展卡来实现此目的:
@IBAction func tapped(sender: UITapGestureRecognizer)
{
if let view = sender.view?.superview as? OrganizationDetailAboutCardCell {
tableView.beginUpdates()
view.toggleReadMore()
tableView.endUpdates()
}
}
func toggleReadMore() {
let expanded = aboutTextLabel.numberOfLines == 5
aboutTextLabel.numberOfLines = expanded ? 5 : 0
}
我很确定所有这些问题都与使用约束的单元格的自动调整有关。但是,我目前对如何修复它感到茫然。有没有人使用约束自动调整单元格大小并更新单元格高度而没有所有tableView做奇怪的跳转?
我尝试过的事情
问题2
对于问题2,我已经尝试更新仅重新加载按钮单元格;
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 2, inSection: 0)], withRowAnimation: UITableViewRowAnimation.None)
然而,这违反直觉导致该部分中的所有单元格不正确地重新计算,最终导致一堆太小的单元格。我也试过这个UITableViewRowAnimation.Fade
但是,这也有同样的结果。
答案 0 :(得分:2)
您是否指定了估计的行高?当我这样做时,我发现这是我的许多布局问题的根源。
另一个可能的问题是您需要将字体分配给标签以使其正确布局。因此,在您的cellForRowAtIndexPath方法中,指定应在所有标签/文本字段/文本视图上使用的字体。
以下是一个示例项目:https://github.com/sgoodwin/SelfSizingCells。
祝你好运!