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

时间:2016-11-22 14:47:34

标签: ios swift autolayout uicollectionview ios10

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

  

断言失败 - [_ UIFlowLayoutSection   computeLayoutInRect:forSection:无效:invalidationContext:]   /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.5.2/UIFlowLayoutSupport.m:823

     

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

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

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

任何想法为什么会崩溃?

2 个答案:

答案 0 :(得分:25)

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

UIViewController子类中:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    collectionView.collectionViewLayout.invalidateLayout()
}

或在UIView子类中:

override func layoutSubviews() {
    super.layoutSubviews()
    collectionView.collectionViewLayout.invalidateLayout()
}

答案 1 :(得分:2)

  

这是iOS10中仅有iPhone Plus设备的一些奇怪错误。我'已经   面对同样的问题,我的解决方案是调用layoutIfNeeded之类的   这样:

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

在不同的UICollectionViewDataSources方法中执行相同的操作   也会起作用

基于 orxelm collectionViewContentSize in iOS 10 using self-sizing cells

上的回答,对我有用的答案

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