我已经创建了一个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。
任何想法为什么会崩溃?
答案 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使用我的流布局,而是使用了默认布局。这迫使我所有的细胞都是相同的大小,这不是理想的结果(无论如何对我来说)。