完美解决UITableView和UICollectionView滚动失效

需求

在新数据源到达后,刷新列表,并直接显示指定位置的item

分析

刷新数据肯定是用 reloadData(),直接显示指定位置,很明显需要用到滚动操作,并且不带滚动动画,直接滚动到指定的位置。

  • 下面以 collectionView 为例,滚动不生效
php 复制代码
collectionView.reloadData()
self.collectionView.scrollToItem(at: IndexPath(item: self.currentIndex, section: 0), at: .right, animated: false)

滚动失效原因

如果直接这样执行,会造成滚动失效,原因 reloadData() 操作可能比较耗时,可能会导致滚动操作在数据刷新完成之前就开始执行,从而导致滚动失效。

解决方案

下面的方法可以完美解决这个问题,就是把滚动操作放入主队列中,当主线程的任务执行完成后,主线程空闲时执行滚动操作。

  • 下面以 collectionView 为例:
php 复制代码
collectionView.reloadData()
DispatchQueue.main.async {
    self.collectionView.scrollToItem(at: IndexPath(item: self.currentIndex, section: 0), at: .right, animated: false)
}
相关推荐
人月神话Lee1 小时前
【图像处理】亮度与对比度——图像的线性变换
ios·ai编程·图像识别
bryceZh2 小时前
iOS26适配-UISplitViewController配置分栏和分屏
ios·ui kit
songgeb2 小时前
NumberFormatter 货币格式化属性详解
ios·swift
for_ever_love__5 小时前
UI学习:数据驱动ce l l
学习·ui·ios·objective-c
KillerNoBlood6 小时前
2026移动端跨平台开发面经总结
android·算法·flutter·ios·移动开发·鸿蒙·kmp
人月神话-Lee7 小时前
【图像处理】颜色科学与灰度化——人眼看到的和数字记录的不一样
图像处理·人工智能·计算机视觉·ios·swift
号码认证服务7 小时前
给用户打电话,怎么在对方手机显示为“XX证券”?号码认证办理步骤
android·运维·服务器·ios·智能手机·iphone·webview
MonkeyKing7 小时前
iOS 启动优化实战:pre-main耗时、二进制重排与动态库裁剪全解析
ios
MonkeyKing7 小时前
iOS 卡顿优化实战:离屏渲染、混合图层与圆角优化全解析
ios
库奇噜啦呼10 小时前
【iOS】源码学习-消息流程分析
学习·ios·cocoa