UITableView-reloadRows方法创建奇怪的滚动错误

时间:2019-07-12 10:03:12

标签: ios swift uitableview uicollectionview uicollectionviewcell

我在其中一个应用中使用UITableView。在tableview的行中,我进行了水平滚动UICollectionView。每当用户双击集合视图的单元格时,它将事件发送回视图控制器以更新数据源。数据源更新后,我正在使用tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)重新加载该特定行,但是却出现了奇怪的滚动错误。

我想重新加载tableview的行及其内容,即collectionview的内容,而没有任何动画或滚动问题。

我尝试了以下解决方案来避免这种情况,但是没有运气:(

UIView.performWithoutAnimation {
    self.tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)
}

我什至试图记住tableview和collectionview的内容偏移,但是闪烁仍然存在。如果您遇到这样的问题,请指导我

4 个答案:

答案 0 :(得分:2)

这是UI布局问题。当您重新加载单元格/节时,它会重新计算其内容大小,因此,如果您具有动态大小的单元格,则tableView内容大小特别如此。我建议2种解决方案

解决方案I(暴躁):

  • 保存当前视图的表视图重载状态前的内容偏移量,然后在重载过程后滚动到该视图且不显示动画

解决方案II(更好):

  • 直接更新数据源及其绑定的单元,而无需重新加载UITableView(可以考虑更新UICollectionView-除非动态地更新,否则您需要设置UITableViewCell高度的动画)。

答案 1 :(得分:0)

在将图像放入单元格之前,如果可能,请创建图像的缩略图,然后滚动。

答案 2 :(得分:-1)

尝试tableView.reloadData()或您必须按升序重新排列indexPath,然后重新加载特定的indexPath。

答案 3 :(得分:-1)

所有带有UI的操作都需要在主线程异步中执行。 试试这个:

DispatchQueue.main.async {
    UIView.performWithoutAnimation {
         self.tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)
    }
}