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

16
我创建了一个UICollectionView,在iPhone 5s/SE/6/6s/7等小型设备的模拟器和真实设备上都可以正常工作,但是在iPhone 6Plus、iPhone 7Plus和任何iPad版本上就会出现奇怪的情况。在真实设备上它运行良好,但在模拟器中会崩溃,提示以下错误信息:
“Assertion failure in -[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:invalidationContext:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.5.2/UIFlowLayoutSupport.m:823”
“Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionViewFlowLayout internal error'”
目前我发现的问题是,如果我去掉estimatedItemSize,那么它就可以正常工作,但是自动布局就不再起作用;但是如果启用它,那么模拟器就会崩溃。
我正在使用最新版本的Xcode和iOS 10。
有什么想法为什么会崩溃吗?

你看过这个吗?https://dev59.com/-VkS5IYBdhLWcg3wvI20 - PrafulD
非常奇怪。你尝试清除DerivedData文件夹了吗? - Nathaniel
@PrafulD 是的,但我没有那个案例。 - lorandcsatlos
2个回答

30

在处理此问题时,调用invalidateLayout可以作为一种解决方法。

UIViewController子类中:

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

或者在一个 UIView 的子类中:

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

这是否被认为是苹果的一个错误,还是我们做错了什么?只要我使用UICollectionViewController,整个东西对我来说都是有效的,一旦切换到UIViewController,我就会得到这个错误:-/ - d4Rk
2
在我看来,这是UIKit的一个bug。如果你要支持iOS 10,你需要解决这个bug。 - Yoichi Tagaya
1
谢谢,你的答案解决了我的问题。在iOS 11中没有问题,可以完美地工作,但对于iOS 10,您需要调用invalidateLayout()。 - fruechtemuesli
可以用!谢谢! - Serhii Londar

5

This is some strange bug in iOS10 with iPhone Plus devices only. I've faced the same issue, my solution was to call layoutIfNeeded like this:

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

Doing the same thing in different UICollectionViewDataSources methods will work as well

以下是对我有用的答案,基于 orxelmcollectionViewContentSize in iOS 10 using self-sizing cells 的回答。

无效化布局似乎会阻止我的 collectionView 使用流式布局,而是使用默认布局。这强制所有单元格的大小都相同,这不是期望的结果(至少对我来说不是)。


1
谢谢,它已经修复了在运行iOS 10的iPhone Plus上的崩溃问题。 - Salman500
很高兴能帮忙 :) - James Wolfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接