UICollectionView - iOS 10 - 在iPhone 6 Plus模拟器上崩溃,但在真实设备上运行

lor*_*los 13 ios autolayout uicollectionview swift ios10

我已经创建了一个UICollectionView,可以在模拟器和真实设备上的iPhone 5s/SE/6/6s/7等小型设备上正常工作,但是当涉及iPhone 6Plus,iPhone 7Plus和任何iPad版本时,我都有一个奇怪的情况.它在真实设备上工作正常,但它在模拟器中崩溃,出现以下错误:

断言失败 - [_ UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:invalidationContext:],/ BuildRoot/Library/Cache/com.apple.xbs/Source/UIKit_Sim/UIKit-3600.5.2/UIFlowLayoutSupport.m:823

因未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'UICollectionViewFlowLayout内部错误'

到目前为止我发现的是,如果我删除了estimatedItemSize它工作正常,但自动布局不再,但如果我启用它,它会在模拟器中崩溃.

我使用的是最新的Xcode版本和iOS 10.

任何想法为什么崩溃?

Yoi*_*aya 25

invalidateLayout布局之前调用是此问题的解决方法.

UIViewController子类中:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    collectionView.collectionViewLayout.invalidateLayout()
}
Run Code Online (Sandbox Code Playgroud)

或在UIView子类中:

override func layoutSubviews() {
    super.layoutSubviews()
    collectionView.collectionViewLayout.invalidateLayout()
}
Run Code Online (Sandbox Code Playgroud)

  • IMO,这是UIKit的一个错误.如果您支持iOS 10,则需要解决该问题. (2认同)

Jam*_*lfe 5

这是 iOS10 中仅适用于 iPhone Plus 设备的一些奇怪错误。我遇到了同样的问题,我的解决方案是像这样调用layoutIfNeeded:

func numberOfSections(in collectionView: UICollectionView) -> Int {
    collectionView.layoutIfNeeded() // Patch: only to solve UIKit crash on Plus models
    return 1
}
Run Code Online (Sandbox Code Playgroud)

在不同的 UICollectionViewDataSources 方法中执行相同的操作也可以工作

对我有用的答案基于orxelm关于iOS 10 中使用自动调整大小的单元格中的 collectionViewContentSize 的答案

使布局无效似乎会阻止我的 collectionView 使用我的流布局,而是使用默认布局。这迫使我所有的细胞都具有相同的大小,这不是期望的结果(无论如何对我来说)。