iOS UITableViewController 单元格在第一次更改时调整单元格高度后跳出位置

标签 ios uitableview swift3 uicontainerview

更新:看起来 tableView.estimatedRowHeight 设置与问题有某种关系,因为问题的方差随着数字的变化而变化,将其设置为 9999 使其“消失”但这似乎 super 骇人听闻。 9999 还打破了我打算在显示/隐藏上做的动画。 9999 还破坏了滚动条的功能。有关更多详细信息和完整上下文,请参阅下面的讨论主题。

我有一个 View Controller ,它包含两个 Container Views。每个容器 View 都包含一个 UITableView Controller 。它们垂直放置,每个都占据整个高度。

右侧的容器宽度为 100,从屏幕开始,尾随约束设置为 -100,这允许另一个容器最初填充整个屏幕。

左侧的表格使用 UITableViewAutomaticDimension 自动调整单元格高度,因为当显示隐藏 View 时,两行上的某些文本可能需要换行到下一行。

当我将约束更改为 0 并显示 View 时,如果我不在列表的顶部,而不是扩展屏幕上可见的内容,它似乎正在扩展所有内容,从而插入了列表中的内容屏幕向下,比它应该去的更远。

但奇怪的是,随后的展开/折叠会按预期工作,只调整可见部分。

我附上了一个视频来展示这个问题,我只是想把事情联系起来,让尺寸调整工作,正确 View 中的内容最终会有所不同。

下面是视频中发生的事情

  1. 我从列表顶部展开/折叠,它按预期工作
  2. 我滚动到列表中间并展开,然后我的内容被向下推得比它应该的更深。
  3. 然后我再次折叠并展开它,这次它留在原处,因为可见屏幕上的尺寸没有改变。

无论我在列表中走多远,相同的行为都会发生,而且越往下越糟。

enter image description here

我现在正在按这样的按钮调整约束。

   if self.timeContainerConstraint.constant == 0 {
        self.timeContainerConstraint.constant = -90.0
   } else {
        self.timeContainerConstraint.constant = 0.0
   }

有谁知道为什么当我向下滚动列表并第一次展开时内容会跳转,但在后续尝试时不会跳转?

最佳答案

由于您有可变的单元格高度,tableview 无法在其框架更改时正确计算滚动偏移量。它必须依赖估计的行高,但由于您对此有一个固定值,因此当前滚动位置“上方”的单元格越多,估计值与实际值之间的误差就越大。

我能够通过缓存单元格高度来解决这个问题,以便使用 estimatedHeightForRowAt: 返回更准确的估计高度

var cellHeights = [IndexPath:CGFloat]()

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let frame = tableView.rectForRow(at: indexPath)

    self.cellHeights[indexPath] = frame.size.height

}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return self.cellHeights[indexPath] ?? 140.0
}

使用这种方法,边栏的扩展和收缩不会影响表格的位置。我能够为约束变化设置动画以实现平滑显示,并且表格没有“跳跃”,即使在边栏打开时表格正在滚动也是如此。

我的示例项目是 here

关于iOS UITableViewController 单元格在第一次更改时调整单元格高度后跳出位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42967417/

相关文章:

swift3 - 为什么 repeatForever 在 spritekit, swift3 中不起作用

android - 如何设置 ScrollView 以适应 React Native?

ios - 如何从 Xcode 中 UITests 下的 UIImagePickerController 中的某个索引处选择图像?

ios - 无法使用Kivy工具链编译适用于iOS的第三方程序包

iphone-sdk-3.0 - UITableView 中的 UISearchBar

ios - 当 TableView 滚动时如何阻止 uitableviewcell 中的 uipangesturerecognizer

ios - 捕获 UIView 并另存为图像

ios - 图像是由 UIImagePickerControllerSourceTypeCamera 拍摄的如何将其保存在 ios 的数据库中

ios - 如何更改已加载的表格单元格的高度?

ios - Swift 3 UITableView 不更新