我的应用程序架构有问题...
我有一个 UITableView
,其中填充了自定义 UITableViewCells
。
当然,我使用了出列,因此只生成了 8-10 个单元格实例。
继续我的问题...我已将主题功能添加到我的应用程序中。
当用户长时间触摸主 UINavigationBar
时,会在应用程序范围内发布一条通知,通知每个 viewController 更新其 UI。
当托管带有自定义单元格的 tableView 的 viewController 收到通知时,它会调用 tableView.reloadData()
这很有效,因为我已经实现了 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
在 willDisplay
中,我在我的自定义 tableViewCell 上调用了一个方法,该方法使用 UIViewAnimation
对单元格进行适当的颜色更改。
看起来像这样:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let newsFeedItemCell = cell as? NewsFeedItemCell {
if (self.nightModeEnabled) {
newsFeedItemCell.transitionToNightMode()
} else {
newsFeedItemCell.transitionFromNightMode()
}
}
}
在自定义单元格实现中,这些方法如下所示:
func transitionToNightMode() {
UIView.animate(withDuration: 1, animations: {
self.backgroundColor = UIColor.black
self.titleTextView.backgroundColor = UIColor.black
self.titleTextView.textColor = UIColor.white
})
}
func transitionFromNightMode() {
UIView.animate(withDuration: 1, animations: {
self.backgroundColor = UIColor.white
self.titleTextView.backgroundColor = UIColor.white
self.titleTextView.textColor = UIColor.black
})
}
这工作正常...继承人的问题:
在滚动 tableView 时,任何不在屏幕上的单元格 滚动到屏幕上 时都会调用颜色更新/动画代码,这会导致不和谐用户体验。
我当然理解为什么会发生这种情况,因为 willDisplay
仅在单元格显示时被调用。
我想不出避免这种情况的优雅方法。
我很高兴在屏幕上的单元格正在为用户体验带来愉悦的动画效果,但是,对于屏幕外的单元格,我宁愿它们跳过动画.
可能的解决方案(虽然不够优雅):
保留对 cellForRow
创建的 8-10 个单元格中的每一个的引用,并检查它们是否在屏幕外,是否立即设置了它们的状态。
但是,我不喜欢保留对每个单元格的引用的想法。
有什么想法吗?
最佳答案
我不会使用 reloadData
来为此设置动画,因为您的 tableview 数据模型实际上并没有改变。
相反,我会给 UITableView 一个函数,如下所示:
class myClass : UITableViewController {
....
func transitionToNightMode() {
for visible in visibleCells {
UIView.animate(withDuration: 1, animations: {
visible.backgroundColor = UIColor.black
visible.titleTextView.backgroundColor = UIColor.black
visible.titleTextView.textColor = UIColor.white
})
}
}
}
然后在您的 willDisplay 或 cellForItemAt 中,设置没有动画的正确外观。
关于ios - 动画自定义 UITableViewCell 时的计时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48924559/