每秒重新加载 Tableview 部分会导致闪烁

Posted

技术标签:

【中文标题】每秒重新加载 Tableview 部分会导致闪烁【英文标题】:Reloading the Tableview section after every second is causing flickering 【发布时间】:2019-05-07 07:35:07 【问题描述】:

我正在尝试每秒用新的数据源重新加载我的 Tableview,但是在重新加载时会有轻微的闪烁,用户可以清楚地看到。

我要求每秒刷新一次数据源是因为我每秒都从 API 获取新的服务器时间。

我使用以下不同的方法重新加载了我的 tableView 的 3 个部分,但现在似乎提供了无闪烁的体验。

方法一

 UIView.performWithoutAnimation 
                UIView.setAnimationsEnabled(false)
                weakSelf.tradeTableView.reloadSections([0,1,2], with: .none)
            

方法二

      UIView.setAnimationsEnabled(false)
      weakSelf.tradeTableView.beginUpdates()
      weakSelf.tradeTableView.reloadSections([0,1,2], with: .none)
      weakSelf.tradeTableView.endUpdates()
      UIView.setAnimationsEnabled(true)

两种方法都提供闪烁体验。

【问题讨论】:

为什么你需要每秒更新你的部分? 正如我所提到的,我每秒从服务器获取更新的服务器时间,这就是为什么我需要更新 tableview 部分以反映这些更改。 如果您只添加数据,您可以插入行而不是重新加载所有数据。 嗨 Samarth 可以在 performWithoutAnimation 块中尝试 tradeTableView.layer.removeAllAnimations(),我也更喜欢使用 rxswift 来处理这种事情,因为你每秒都在重新加载 tableview,这并不好,希望它有所帮助:P @ShivamGaur 我收到了使用 RxSwift 的建议,请您指导我 【参考方案1】:

是闪烁还是跳跃?

如果滚动视图跳转检查这些答案Jumpy tableview after reload

【讨论】:

【参考方案2】:

这个这个

            let loc = tradeTableView.contentOffset  // this line is added to lock offset of tableview
            UIView.performWithoutAnimation 
                tradeTableView.beginUpdates()
                tradeTableView.reloadData()
                tradeTableView.endUpdates()

                tradeTableView.layer.removeAllAnimations()
                tradeTableView.setContentOffset(loc, animated: false)
             

【讨论】:

【参考方案3】:

你可以试试这个

        UIView.setAnimationsEnabled(false)
        self.tradeTableView.beginUpdates()
        self.tradeTableView.endUpdates()
        UIView.setAnimationsEnabled(true)

【讨论】:

以上是关于每秒重新加载 Tableview 部分会导致闪烁的主要内容,如果未能解决你的问题,请参考以下文章

自定义 TableViewCells 在重新加载 tableview 时闪烁

重新加载时阻止透明 UITableView 部分标题闪烁

如何在 swift 中仅为唯一值更新 TableView 行?

firebase 删除值导致 tableview 重新加载元素的两倍

UITableview 与 UIRefreshcontroller 一起闪烁

UICollectionView reloadData 但查看闪烁