UIRefreshControl添加到UICollectionView后快速下拉偶发异常回弹问题
问题原因
这是iOS系统UIRefreshControl和带导航栏的滚动视图配合时的已知布局bug,快速下拉集合视图时滚动偏移量远超刷新触发阈值,系统自动调整scrollView.contentInset和导航栏偏移的逻辑发生冲突,就会出现瞬间回弹的异常。
解决方案
你可以按以下优先级尝试修复:
- 修改集合视图顶部约束
原代码中集合视图的顶部约束绑定了view.topAnchor,会和导航栏的布局计算产生干扰,替换为绑定安全区顶部即可:// 替换setupCollectionView中的顶部约束行 collectionView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor) - 关闭系统自动调整滚动视图内边距
在viewDidLoad中添加以下代码,避免系统自动修改滚动视图的内边距导致布局冲突:// 适配全版本 automaticallyAdjustsScrollViewInsets = false // iOS 11及以上补充设置 if #available(iOS 11.0, *) { collectionView.contentInsetAdjustmentBehavior = .never } - 优化刷新结束逻辑
先判断刷新控件的状态再调用结束刷新方法,避免状态错乱触发布局异常:DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: { [weak self] in guard let self = self, self.refreshControl.isRefreshing else { return } self.refreshControl.endRefreshing() }) - 兜底方案
如果以上方案都无法解决,可替换系统UIRefreshControl为第三方刷新控件,这类控件已经提前适配了系统布局bug,不会出现该异常。
内容的提问来源于stack exchange,提问作者Yuuu
相关产品推荐
相关产品推荐

