具有约束更新的 UITableViewCell 导致 UITableView 跳来跳去

UITableViewCell with Constraint updates cause UITableView to jump around

总结

在 tableView 中调整行大小和重新加载行,其中每个单元格都具有通过约束计算的动态高度,这会导致许多其他单元格不必要地重新计算。我该如何解决?

可以找到示例项目 here

长版

我有一个视图显示公司的详细信息和可变数量的单元格(或 卡片)以及更详细的信息。我在具有动态大小单元格的 UITableViewController 中实现了这一点,使用自动布局约束(主要由 this Ray Wenderlich tutorial 帮助)。

该视图包含以下高度可变的单元格:

'About Card' 可能有也可能没有 header 图片,并且可以展开以显示整个文本。

目前我遇到了四个问题:

  1. UITableViewController 被推送 animating: true。但是,tableView 从导航栏后面开始,并在完成动画后跳下。不知道为什么。

更新 这似乎并不总是发生。喜悦。

  1. 在执行应重新加载按钮以指示状态更改的操作时,它会很好地重新加载按钮单元格。但是,它也会导致公司信息单元格向下跳动并向上移动。

使用以下代码更新单元格:

func organizationRequestsUpdated() {
    self.tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: UITableViewRowAnimation.None)
}

  1. 点击关于卡应该会展开它。我目前通过在单元启动时设置 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 做奇怪的跳跃的情况下自动调整单元格的大小并更新单元格高度?

  1. 返回到 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

祝你好运!