带有约束更新的UITableViewCell会导致UITableView跳转

时间:2015-04-03 14:35:15

标签: ios uitableview autolayout

摘要

调整和重新加载tableView中的行,其中每个单元格都具有由约束计算的动态高度,导致许多其他单元格不必要地重新计算。我该怎么解决这个问题?

可以找到示例项目here

长版

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

视图具有以下具有可变高度的单元格:

  • 第0节
    • 第0行:标题图片
    • 第1行:公司信息
    • 第2行:按钮
  • X部分> 0
    • 第0行:关于卡

“关于卡片”可能有也可能没有标题图片,可以展开以显示整个文字。

目前我遇到了四个问题:

  1. 使用animating: true推送UITableViewController。但是,tableView从导航栏后面开始,并在完成动画时跳转。不知道为什么。
  2. 更新这似乎不会持续发生。喜悦。

    TableView jumps down after push animation

    1. 当执行应该重新加载按钮以指示状态更改的操作时,它会很好地重新加载按钮单元格。但是,它还会导致公司信息单元向下跳动并向上动画。
    2. 使用以下代码更新单元格:

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

      Reloading a cell causes other cell to animate

      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
        }
        
      2. Changing variables that should trigger height change cause everything to jump around

        我很确定所有这些问题都与使用约束的单元格的自动调整有关。但是,我目前对如何修复它感到茫然。有没有人使用约束自动调整单元格大小并更新单元格高度而没有所有tableView做奇怪的跳转?

        1. 弹回UITableViewController使大多数单元格处于错误的高度。不知道为什么。
        2. enter image description here

          我尝试过的事情

          问题2

          对于问题2,我已经尝试更新仅重新加载按钮单元格;

          self.tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 2, inSection: 0)], withRowAnimation: UITableViewRowAnimation.None)
          

          然而,这违反直觉导致该部分中的所有单元格不正确地重新计算,最终导致一堆太小的单元格。我也试过这个UITableViewRowAnimation.Fade但是,这也有同样的结果。

1 个答案:

答案 0 :(得分:2)

您是否指定了估计的行高?当我这样做时,我发现这是我的许多布局问题的根源。

另一个可能的问题是您需要将字体分配给标签以使其正确布局。因此,在您的cellForRowAtIndexPath方法中,指定应在所有标签/文本字段/文本视图上使用的字体。

以下是一个示例项目:https://github.com/sgoodwin/SelfSizingCells

祝你好运!