将[UICollectionView performBatchUpdates:]与具有UIDynamics的UICollectionViewFlowLayout一起使用

时间:2013-12-07 00:36:43

标签: ios objective-c uicollectionview uicollectionviewlayout uikit-dynamics

好的基本概述。我有UICollectionView我需要支持通过performBatchUpdates:方法添加和删除项目。如果我使用标准UICollectionViewFlowLayout,它可以正常工作。

但是,当我尝试使用由UICollectionViewFlowLayout提供支持的UIDynamicAnimator时,我会在拨打performBatchChanges后立即崩溃。

在我的自定义UICollectionViewFlowLayout课程中,永远不会调用prepareForCollectionViewUpdates:方法。我使用的自定义UICollectionViewFlowLayout基于this sample

崩溃后的控制台输出是......

*** Assertion failure in -[UICollectionViewData layoutAttributesForItemAtIndexPath:], /SourceCache/UIKit/UIKit-2903.23/UICollectionViewData.m:581
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no UICollectionViewLayoutAttributes instance for -layoutAttributesForItemAtIndexPath: <NSIndexPath: 0xc000000000028096> {length = 2, path = 2 - 5}'
*** First throw call stack:
libc++abi.dylib: terminating with uncaught exception of type NSException

有什么想法吗?

1 个答案:

答案 0 :(得分:13)

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewLayoutAttributes *layoutAttributes = [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
    if(!layoutAttributes) {
        layoutAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];
    }
    return layoutAttributes;
}

当您执行performBatchUpdates时,[self.dynamicAnimator layoutAttributesForCellAtIndexPath:会返回nil,如果将通过更新创建的单元格不可见。 所以只返回super(也许是UICollectionViewFlowLayout)' 现在是layoutAttributes。 当即将显示的单元格时,UIDynamicAnimator将为您完成工作。