Использование [UICollectionView performBatchUpdates:] с UICollectionViewFlowLayout с UIDynamics

Итак, базовый обзор. У меня есть UICollectionView, что мне нужно поддерживать добавление и удаление элемента с помощью метода performBatchUpdates:. Если я использую стандартный UICollectionViewFlowLayout, он отлично работает.

Однако, когда я пытаюсь использовать UICollectionViewFlowLayout, на котором работает UIDynamicAnimator, я получаю сбой, как только я вызываю performBatchChanges.

В моем обычном классе UICollectionViewFlowLayout метод prepareForCollectionViewUpdates: никогда не вызывается. Пользовательский UICollectionViewFlowLayout, который я использую, основан на этом примере.

Выход консоли после сбоя...

*** 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

попробовать

- (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) ' s layoutAttributes. И когда ячейка, которая будет отображаться, UIDynamicAnimator выполнит эту работу для вас.