ios - 动画自定义 UITableViewCell 时的计时问题

标签 ios swift uitableview uiviewanimation

我的应用程序架构有问题...

我有一个 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/

相关文章:

ios - 区域确实改变了准确性

php - POST 不工作 SWIFT PHP

ios - 为什么我的 TableView 不起作用?

javascript - Cordova iOS - 插件未加载

ios - 获取 View 的导航栏颜色不起作用

ios - 以只读方式刷新解析本地数据存储

ios - 使用 Swift 以编程方式向按钮添加约束

ios - 如何检查应用程序何时从后台返回到前台,而不是从推送通知返回?

ios - 在 iOS 中使用核心数据时,如何为分段 TableView 构建sections数组?

iphone - 我怎样才能像这样为我的表格单元格创建一个附件 View ?