UITableView reloadData时UIRefreshControl出现异常行为
解决UIRefreshControl结束动画时闪烁跳动的问题
我之前也碰到过这个烦人的刷新动画异常问题,结合你的代码来看,大概率是UI操作未在主线程执行或者刷新时机的微小冲突导致的,给你几个针对性的解决方案:
1. 强制所有UI操作在主线程执行
网络请求的回调块有时候会在后台线程触发(哪怕你用的网络库默认主线程回调,也可能有例外情况),这时候直接调用endRefreshing()和reloadData()就会导致UI不同步,出现闪烁跳动。
修改你的fetchSurveys回调代码,把所有UI相关操作包裹在DispatchQueue.main.async里:
@objc private func fetchSurveys() { viewModel.fetchSurveys(success: { [weak self] in DispatchQueue.main.async { self?.mainView.configureEmptyTableView(isHidden: false) self?.mainView.tableView.reloadData() // 先刷新表格,再结束刷新动画,避免表格内容变化导致的偏移跳动 self?.mainView.refreshControl.endRefreshing() } }, failure: { [weak self] error in DispatchQueue.main.async { self?.mainView.configureEmptyTableView(with: "Unable to fetch surveys. Please try again.", isHidden: true) self?.mainView.refreshControl.endRefreshing() } }) }
2. 调整刷新顺序:先reloadData再endRefreshing
你之前是先结束动画再刷新表格,这时候表格内容更新会改变contentSize,可能导致refreshControl的位置突然跳动。反过来先更新表格数据,让tableView先完成布局,再结束刷新动画,能避免大部分跳动问题。
3. 处理空表格的特殊情况
如果你的空表格配置会修改tableView的contentInset或者隐藏表格显示空视图,建议在刷新表格后再处理空状态,确保tableView的布局稳定后再调整:
DispatchQueue.main.async { self?.mainView.tableView.reloadData() // 先让表格完成数据刷新和布局 self?.mainView.tableView.layoutIfNeeded() self?.mainView.configureEmptyTableView(isHidden: false) self?.mainView.refreshControl.endRefreshing() }
这些调整应该能解决你遇到的闪烁跳动问题,核心就是保证UI操作在主线程,并且让tableView先完成数据和布局更新,再结束刷新动画。
内容的提问来源于stack exchange,提问作者kkiermasz
相关产品推荐
相关产品推荐

