iOS 10中的collectionViewContentSize使用自调整单元格

Man*_*son 9 objective-c ios uicollectionview ios10

在iOS 10之前,我有一个自我调整表视图,它只包含一个UICollectionView,其中包含使用标准UICollectionViewFlowLayout的自调整单元格.使用自动布局调整集合视图单元格的大小.为了使表格单元格正确调整大小,我必须找到集合视图的内容大小,并在表格单元格的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;
}
Run Code Online (Sandbox Code Playgroud)

对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来违反某些道德规则?在使用自定义单元格时,是否有更好的方法来计算集合视图的内容大小?我宁愿不必从自动布局转移到代码中进行这些大小计算,但这肯定是最糟糕的选择.

orx*_*elm 16

这是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方法中执行相同的操作也可以


小智 1

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

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

希望这有帮助!