iOS 15 UICollectionView 的 UICollectionViewRecursion 问题

问题描述 投票:0回答:7

应用程序在 Xcode 12 和 iOS 14 之前工作正常,但一旦我升级到 Xcode 13 / iOS 15,我的应用程序就停止工作,并显示以下错误日志

2021-11-26 12:49:38.844428+0530 Mitaja[6170:102791] [UICollectionViewRecursion] cv == 0x7feb458e0000 Enabling recursion trigger logging
2021-11-26 12:49:39.040798+0530 Mitaja[6170:102791] [UICollectionViewRecursion] UICollectionView 0x7feb458e0000 Visible cells update scheduled with call stack:
 (
    0   UIKitCore                           0x00007fff24644a06 -[UICollectionView _setNeedsVisibleCellsUpdate:withLayoutAttributes:] + 107
    1   UIKitCore                           0x00007fff24675708 -[UICollectionView _invalidateLayoutWithContext:] + 1310
    2   UIKitCore                           0x00007fff246a660c -[UICollectionViewLayout invalidateLayoutWithContext:] + 200
    3   UIKitCore                           0x00007fff2469a329 -[UICollectionViewFlowLayout invalidateLayoutWithContext:] + 667
    4   UIKitCore                           0x00007fff246a3b5f -[UICollectionViewFlowLayout _didPerformUpdateVisibleCellsPassWithLayoutOffset:] + 430
    5   UIKitCore                           0x00007fff24653a33 -[UICollectionView _updateVisibleCellsNow:] + 10438
    6   UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    7   UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    8   UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    9   UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    10  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    11  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    12  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    13  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    14  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    15  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    16  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    17  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    18  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    19  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    20  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    21  UIKitCore                           0x00007fff24653af8 -[UICollectionView _updateVisibleCellsNow:] + 10635
    22  UIKitCore                           0x00007fff24657447 -[UICollectionView layoutSubviews] + 325
    23  UIKitCore                           0x00007fff255bcaad -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2962
    24  QuartzCore                          0x00007fff2893c2b6 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 548
    25  QuartzCore                          0x00007fff289474f1 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 65
    26  QuartzCore                          0x00007fff288830ca _ZN2CA7Context18commit_transactionEPNS_11TransactionEdPd + 652
    27  QuartzCore                          0x00007fff288bac47 _ZN2CA11Transaction6commitEv + 699
    28  QuartzCore                          0x00007fff288bbfc8 _ZN2CA11Transaction25flush_as_runloop_observerEb + 60
    29  CoreFoundation                      0x00007fff20368c77 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    30  CoreFoundation                      0x00007fff2036349c __CFRunLoopDoObservers + 541
    31  CoreFoundation                      0x00007fff20363a4c __CFRunLoopRun + 1126
    32  CoreFoundation                      0x00007fff20363103 CFRunLoopRunSpecific + 567
    33  GraphicsServices                    0x00007fff2c851cd3 GSEventRunModal + 139
    34  UIKitCore                           0x00007fff24ffbe63 -[UIApplication _run] + 928
    35  UIKitCore                           0x00007fff25000a53 UIApplicationMain + 101
    36  Mitaja                              0x0000000108209adf main + 63
    37  dyld                                0x000000010ca84e1e start_sim + 10
    38  ???                                 0x000000010f5854fe 0x0 + 4552414462
    39  ???                                 0x0000000000000000 0x0 + 0
    40  Mitaja                              0x0000000106ff7000 __dso_handle + 0
)


2021-11-26 12:49:40.736245+0530 Mitaja[6170:102791] [UICollectionViewRecursion] <UICollectionView: 0x7feb458e0000; frame = (122.5 0; 291.5 0); clipsToBounds = YES; hidden = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x600002764810>; layer = <CALayer: 0x600002d43b00>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}; layout: <UICollectionViewFlowLayout: 0x7feb43fa4810>; dataSource: <Mitaja.JPostCardVC: 0x7feb452ed000>> is stuck in its update/layout loop. See previous logs in the "UICollectionViewRecursionCategory" to find callers that scheduled a recursive update
2021-11-26 12:49:40.736365+0530 Mitaja[6170:102791] *** Assertion failure in -[UICollectionView _setNeedsVisibleCellsUpdate:withLayoutAttributes:], UICollectionView.m:1511

解决方案应该是什么?
任何帮助将不胜感激。
我尝试调试了很多次但没有成功,请帮助我。

编辑

“UICollectionView () 陷入更新/布局循环中。发生这种情况的原因有很多,包括自调整大小的视图,其首选属性未返回一致的大小。要调试此问题,请检查控制台应用程序中的日志“UICollectionViewRecursion”类别。”

崩溃错误描述

uicollectionview uicollectionviewlayout ios15
7个回答
2
投票

我在 iOS 15 中遇到了类似的问题。在我的例子中,它是通过重写 UICollectionViewFlowLayout 方法修复的:

override func shouldInvalidateLayout(forPreferredLayoutAttributes preferredAttributes: UICollectionViewLayoutAttributes, 
         withOriginalAttributes originalAttributes: UICollectionViewLayoutAttributes) -> Bool {
    return true
}

0
投票

我们使用 Xamarin.Forms 的 iOS 应用程序遇到了同样的错误。我们能够通过显式指定集合视图中项目的高度来解决该问题。这不是永久的解决方案,但应该能够帮助您摆脱崩溃。


0
投票

我在这里https://github.com/WenchaoD/FSCalendar/issues/1351回答了类似的问题;初步判断是布局中计算item尺寸时item的总宽度超过了屏幕宽度。建议在计算item size时使用floor to round down来暂时解决这个问题;同样的代码在ios15 Version 2之前可以正常运行;另外,很奇怪的是我在iPhone 11上没有问题,在iPhone 11 Pro max上就会出现闪退


0
投票

https://github.com/xamarin/Xamarin.Forms/issues/15230 提到了一些解决方法。我知道它是 Xamarin.Forms,但在幕后 ItemSizingStrategy="MeasureFirstItem" 可能会转换为 UICollectionView 上的 iOS 属性


0
投票

我也遇到过这个问题,已经解决了。

在我的例子中,根本原因是 UICollectionViewFlowLayout 子类中的覆盖方法有一个糟糕的实现,它们保留所有集合大小(缓存它们)以供以后重用,而不是在委托调用时进行计算。

因此,您应该检查从 UICollectionViewFlowLayout 继承的类,以确保它们没有引用循环,并且不应该有递归,并保持安全。

希望你有一个好的解决方案。


0
投票

您可以采取两件简单的事情来避免这种崩溃。

  1. 在单元格内,重写函数
    preferredLayoutAttributesFitting
    并在对 x、y、高度和宽度进行四舍五入后返回布局属性。
  2. 删除我们为默认或估计宽度和高度设置的estimatedItemSize。

0
投票

当我尝试将许多部分放入一个列表中时,我也在 SwiftUI 中遇到了这个错误。我确实通过使用较少的部分或更改为自定义组件来摆脱错误

© www.soinside.com 2019 - 2024. All rights reserved.