Использование [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
выполнит эту работу для вас.