UITableViewCell 在可见路径重新加载行后未调整大小

Posted

技术标签:

【中文标题】UITableViewCell 在可见路径重新加载行后未调整大小【英文标题】:TableViewCell not resizing after reloading rows at visible paths 【发布时间】:2018-07-24 19:14:46 【问题描述】:

我有一个自定义的 tableViewCell,我想在视图旋转时调整它的大小。我看了一下这个stack overflow post,因为它解决了同样的问题,但由于某种原因它对我不起作用。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
        super.viewWillTransition(to: size, with: coordinator)


        //start visible row updates
        self.instructionsTableView.beginUpdates()
        //reload rows that are at the "visible" indexPaths
        self.instructionsTableView.reloadRows(at: self.instructionsTableView.indexPathsForVisibleRows!, with: .automatic)
        self.instructionsTableView.endUpdates()

    

【问题讨论】:

应该如何调整单元格的大小以及当前发生了什么? “可见行数”几乎肯定会在轮换过程中发生变化......简单地调用.reloadData() 要容易得多(因为它只重新初始化/重新绘制可见行开始与)。 reloadData() 不是一个好的实现,因为它相当昂贵。 【参考方案1】:

在协调器中使用animateAlongsideTransition 传递一个空动画块和一个完成块,将您的更新代码移动到完成块中,以便在转换完成后触发。您甚至不需要 reloadRows,因为 begin/endUpdates 会重新计算高度。

【讨论】:

我实施了这个建议。删除重新加载数据的调用不起作用。但是,将beginUpdates,reloadData(),endUpdates 放在完成块中是有效的,但是屏幕更新很慢。有没有办法调整单元格的大小? 您介意解释一下如何使用动画块吗? 动画块用于执行您希望与系统提供的过渡动画一起出现的任何过渡动画。这样做可以避免出现故障动画。但是在您的情况下,您尝试的结果取决于转换的最终状态,因此它是在转换完成后的完成块中完成的。 如果您在完成处理程序中使用reloadData,请不要将其包装在beginUpdates/endUpdates中。 我认为使用重新加载数据有点贵,你会说这是一个更好的选择吗?

以上是关于UITableViewCell 在可见路径重新加载行后未调整大小的主要内容,如果未能解决你的问题,请参考以下文章

在不重新加载的情况下更新 UITableViewCell

重新加载时,UILabel 在 UITableViewCell 中不刷新

为啥手动重用的 UITableViewCell 在重新加载行时会消失?

Objective-C 在 UITableViewCell 中重新加载 UITableView

在运行时重新加载自定义 UITableViewCell 的 Nib

如何重新加载 uitableviewcell 内的集合视图