Xcode13+iOS15下UICollectionView滚动触发UICollectionViewRecursion警告如何解决?
UICollectionViewRecursion警告问题排查方案
警告触发原因
iOS 15 新增了UICollectionView布局递归检测逻辑,用来排查布局过程中循环触发计算的异常场景,你遇到的[UICollectionViewRecursion] cv == 0x7fc7f418e000 Disabling recursion trigger logging警告,就是系统检测到布局过程出现递归触发,为了避免死循环和日志刷屏主动关闭了递归日志输出,结合你的场景,常见触发点如下:
- 自定义Cell或内嵌的CustomUIView在
layoutSubviews、systemLayoutSizeFitting、sizeThatFits等布局周期方法中,主动调用了UICollectionView的reloadData、invalidateLayout等会重新触发全局布局的接口 - CustomUIView的nib约束存在歧义、循环依赖或者优先级冲突,导致CompositionalLayout计算cell尺寸的时候反复迭代触发布局
- nib加载的CustomUIView没有正确添加到cell的contentView上,而是直接添加到了cell本身,导致布局层级计算错乱,触发递归检测
- Xcode 13早期版本的系统bug,CompositionalLayout使用estimated尺寸时会误触发该警告
解决方案
- 排查所有自定义Cell和内嵌CustomUIView的布局相关方法,移除所有在布局周期内触发collectionView刷新、布局失效的代码,这类操作统一放到数据源更新的业务逻辑中执行
- 检查CustomUIView的nib约束,通过Xcode的Debug View Hierarchy工具开启约束警告检测,修复所有约束冲突、循环依赖问题
- 调整CustomUIView的加载逻辑,确保视图是添加到cell的contentView上,约束也相对于contentView设置,示例代码如下:
// Swift 加载nib视图到cell contentView示例 guard let customView = UINib(nibName: "CustomUIView", bundle: nil).instantiate(withOwner: self).first as? CustomUIView else { return } customView.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(customView) NSLayoutConstraint.activate([ customView.topAnchor.constraint(equalTo: contentView.topAnchor), customView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), customView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), customView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) ])
// Objective-C 加载nib视图到cell contentView示例 CustomUIView *customView = [[[NSBundle mainBundle] loadNibNamed:@"CustomUIView" owner:self options:nil] firstObject]; if (customView) { customView.translatesAutoresizingMaskIntoConstraints = NO; [self.contentView addSubview:customView]; [NSLayoutConstraint activateConstraints:@[ [customView.topAnchor constraintEqualToAnchor:self.contentView.topAnchor], [customView.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor], [customView.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], [customView.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor] ]]; }
- 升级Xcode到13.4及以上正式版本,苹果在该版本修复了多个CompositionalLayout在iOS15上的布局检测误报问题
- 若确认所有业务逻辑无问题,可临时屏蔽该警告:打开Xcode对应Scheme,选择Run -> Arguments -> Environment Variables,添加键为
UICollectionViewRecursionLogging,值为NO的环境变量即可
内容的提问来源于stack exchange,提问作者Dhanraja
相关产品推荐
相关产品推荐

