具有约束更新的 UITableViewCell 导致 UITableView 跳来跳去
UITableViewCell with Constraint updates cause UITableView to jump around
总结
在 tableView 中调整行大小和重新加载行,其中每个单元格都具有通过约束计算的动态高度,这会导致许多其他单元格不必要地重新计算。我该如何解决?
可以找到示例项目 here。
长版
我有一个视图显示公司的详细信息和可变数量的单元格(或 卡片)以及更详细的信息。我在具有动态大小单元格的 UITableViewController 中实现了这一点,使用自动布局约束(主要由 this Ray Wenderlich tutorial 帮助)。
该视图包含以下高度可变的单元格:
- 第 0 节
- 第 0 行:Header 图片
- 第 1 行:公司信息
- 第 2 行:按钮
- 第 X 部分 > 0
- 第 0 行:关于卡片
'About Card' 可能有也可能没有 header 图片,并且可以展开以显示整个文本。
目前我遇到了四个问题:
- UITableViewController 被推送
animating: true
。但是,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 做奇怪的跳跃的情况下自动调整单元格的大小并更新单元格高度?
- 返回到 UITableViewController 时,大多数单元格的高度不正确。不知道为什么。
我试过的东西
问题2
对于问题 2,我已经尝试过只更新纽扣电池;
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 2, inSection: 0)], withRowAnimation: UITableViewRowAnimation.None)
然而,这违反直觉导致该部分中的所有单元格重新计算不正确,最终得到一堆太小的单元格。我也试过这个 UITableViewRowAnimation.Fade
但是,结果是一样的。
您是否指定了估计的行高?当我这样做时,我发现这是我许多布局问题的根源。
另一个可能的问题是您需要为标签指定字体以使其布局正确。因此,在您的 cellForRowAtIndexPath 方法中,指定应在所有 labels/textfields/textviews.
上使用的字体
这是一个示例项目:https://github.com/sgoodwin/SelfSizingCells。
祝你好运!
总结
在 tableView 中调整行大小和重新加载行,其中每个单元格都具有通过约束计算的动态高度,这会导致许多其他单元格不必要地重新计算。我该如何解决?
可以找到示例项目 here。
长版
我有一个视图显示公司的详细信息和可变数量的单元格(或 卡片)以及更详细的信息。我在具有动态大小单元格的 UITableViewController 中实现了这一点,使用自动布局约束(主要由 this Ray Wenderlich tutorial 帮助)。
该视图包含以下高度可变的单元格:
- 第 0 节
- 第 0 行:Header 图片
- 第 1 行:公司信息
- 第 2 行:按钮
- 第 X 部分 > 0
- 第 0 行:关于卡片
'About Card' 可能有也可能没有 header 图片,并且可以展开以显示整个文本。
目前我遇到了四个问题:
- UITableViewController 被推送
animating: true
。但是,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 做奇怪的跳跃的情况下自动调整单元格的大小并更新单元格高度?
- 返回到 UITableViewController 时,大多数单元格的高度不正确。不知道为什么。
我试过的东西
问题2
对于问题 2,我已经尝试过只更新纽扣电池;
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 2, inSection: 0)], withRowAnimation: UITableViewRowAnimation.None)
然而,这违反直觉导致该部分中的所有单元格重新计算不正确,最终得到一堆太小的单元格。我也试过这个 UITableViewRowAnimation.Fade
但是,结果是一样的。
您是否指定了估计的行高?当我这样做时,我发现这是我许多布局问题的根源。
另一个可能的问题是您需要为标签指定字体以使其布局正确。因此,在您的 cellForRowAtIndexPath 方法中,指定应在所有 labels/textfields/textviews.
上使用的字体这是一个示例项目:https://github.com/sgoodwin/SelfSizingCells。
祝你好运!