iOS 10中使用自定义单元格的collectionViewContentSize

在iOS 10之前,我有一个自定义表格视图,它只包含一个使用标准UICollectionViewFlowLayout的自定义单元的UICollectionView。 集合视图单元格的大小使用自动布局。 为了让表格单元格能够正确地resize,我必须find集合视图的内容大小,并在表格单元格的systemLayoutSizeFittingSize:withHorizo​​ntalFittingPriority:verticalFittingPriority:中使用它。

我还发现,调用collectionView.collectionViewLayout.collectionViewContentSize使用estimatedItemSize而不是大小正确的单元格,除非我调用了collectionView layoutIfNeeded。 这导致了systemLayoutSizeFittingSize:

- (CGSize) systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority { self.collectionView.frame = CGRectMake(0, 0, targetSize.width, FLT_MAX); [self.collectionView layoutIfNeeded]; CGSize collectionViewContentSize = self.collectionView.collectionViewLayout.collectionViewContentSize; CGFloat verticalPadding = fabs(self.collectionViewTopPaddingConstraint.constant) + fabs(self.collectionViewBottomPaddingConstraint.constant); CGSize cellSize = CGSizeMake(collectionViewContentSize.width, collectionViewContentSize.height + verticalPadding); return cellSize; } 

对layoutIfNeeded的调用现在会导致*** Assertion failure in -[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:invalidationContext:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3599.6/UIFlowLayoutSupport.m:823

我通过调用systemLayoutSizeFittingSize中的layoutIfNeeded违反了一些道德规则? 有没有更好的方法来计算集合视图的内容大小,当它使用自我大小的单元格? 我宁愿不必从自动布局移动到在代码中进行这些大小的计算,但这当然是最糟糕的情况。

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

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

在不同的UICollectionViewDataSources方法中做同样的事情也会起作用

在iOS 10上开发我的应用程序时遇到同样的问题。删除第一行解决了我的问题。

self.collectionView.frame = CGRectMake(0, 0, targetSize.width, FLT_MAX); //Remove this

希望这个帮助!

就我而言,在布局之前调用invalidateLayout是解决此问题的一种解决方法。

UIViewController子类中:

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

或者在UIView子类中:

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

在iOS 10上开发我的应用程序时,我遇到了同样的问题,并在awakeFromNib UICollectionViewDataSource设置为自己,如下所示:

 override func awakeFromNib() { super.awakeFromNib() let layout = UICollectionViewFlowLayout() // set your layout collectionViewLayout = layout // set dataSource equal to self in here cause a crash dataSource = self } 

然后我将UICollectionViewDataSource设置代码移到layoutSubviews ,问题就解决了,如下所示:

 override func layoutSubviews() { super.layoutSubviews() dataSource = self } override func awakeFromNib() { super.awakeFromNib() let layout = UICollectionViewFlowLayout() // set your layout collectionViewLayout = layout // set dataSource equal to self in here cause a crash dataSource = self } 

希望这个帮助!