【问题标题】:Update TableView Cell Height as cell content interaction happens发生单元格内容交互时更新 TableView 单元格高度
【发布时间】:2020-02-26 02:19:04
【问题描述】:

我有一个UITableView,其中包含许多单元格。在下面的示例中,这两行中的每一个都包含一个 UICollectionView,它正在管理标签。初始加载工作正常,tableView 根据 UICollectionView 高度正确调整行大小。

viewDidLoad方法中,我为tableView设置了如下配置:

        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = UITableView.automaticDimension

然后,在viewDidAppear 方法中,我要求更新tableView,如下所示:

   override func viewDidAppear(_ animated: Bool) {
        tableView.beginUpdates()
        tableView.endUpdates()
    }

问题 1: 这种工作,除了它动画 tableView 行高的增加。有没有办法只在初始加载时解决这个问题?

第二个问题是,如果用户与内容交互并删除其中一个,即使 collectionView 调整大小,它更新的内容大小也不会触发 tableView 行更新其高度,可以看出在下面的屏幕截图中:

这可能是因为它位于 tableView cell 内,因为通常情况下,collectionView 会自动调整大小。当collectionViewtableView 之外时,请参阅下面的屏幕截图。

如果我滚动 tableView,该行将作为双端队列/重用过程的一部分正确调整大小。见下文:

我认为问题的一部分是collectionViewtableViewCell 内时的布局约束是它被固定在tableViewCell 的边缘,但除非我这样做,否则它不会无法正确显示所以迷路了...

问题 2: 如何修复 tableView 行高根据其内容的更改调整大小?

【问题讨论】:

  • 通常您将tableView.estimatedRowHeight 设置为估计的高度。大多数情况下,该值无关紧要。尝试 44 到 88(或其他)之间的值。只是不要使用UITableView.automaticDimension。至于何时更新集合视图,您需要在您的集合视图上实现一个自定义委托,您的表视图控制器可以订阅该委托。当该委托方法触发您的表格视图控制器时,您可以为相应的表格视图单元格调用tableView.reloadRows。试一试,告诉我们进展如何。

标签: ios swift uitableview uicollectionview


【解决方案1】:

问题#1 - 在viewDidAppear 中使用tableView.reloadData() 而不是beginUpdates

问题#2 - 当用户与UICollectionView的内容交互时调用tableView.reloadRows()

【讨论】:

  • 我不建议在更新单个单元格时重新加载整个表格视图。这会导致糟糕的用户体验。
  • 是的,我同意不使用reloadData。 @Timur - 看看这个来自 Apple 的视频,尤其是在 30 分钟时...developer.apple.com/videos/play/wwdc2018/225/?time=41
  • @Anthony,感谢您的视频!我完全同意你和 Rob 的看法 - reloadRows 是更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2012-04-21
  • 2017-04-18
相关资源
最近更新 更多