В моем проекте я использую UICollectionView для отображения сетки значков.
Пользователь может изменить порядок, щелкнув сегментированный элемент управления, который вызывает выборку из основных данных с другим NSSortDescriptor.
Объем данных всегда одинаков, просто попадает в разные разделы / строки:
- (IBAction)sortSegmentedControlChanged:(id)sender {
_fetchedResultsController = nil;
_fetchedResultsController = [self newFetchResultsControllerForSort];
NSError *error;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.collectionView reloadData];
}
Проблема в том, что reloadData не анимирует изменение, UICollectionView просто появляется с новыми данными.
Следует ли мне отслеживать, в каком indexPath находилась ячейка до и после изменения, и использовать [self.collectionView moveItemAtIndexPath: toIndexPath:] для выполнения анимации для изменения или есть лучший метод?
Я не особо разбирался в создании подклассов collectionViews, поэтому любая помощь будет отличной ...
Спасибо, Билл.
ios
uicollectionview
Нимрод7
источник
источник
reloadData
вызов в блок анимации?Ответы:
reloadData не анимируется и не делает этого надежно, когда помещается в блок анимации UIView. Он хочет быть в блоке UICollecitonView performBatchUpdates, поэтому попробуйте что-нибудь вроде:
[self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:^(BOOL finished) { // do something on completion }];
источник
-reloadSections:
заставляет это работать.Обертывание
-reloadData
в ,-performBatchUpdates:
кажется, не вызывает представление коллекции в один раздел анимировать.[self.collectionView performBatchUpdates:^{ [self.collectionView reloadData]; } completion:nil];
Однако этот код работает:
[self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:nil];
источник
self.collectionView performBatchUpdates
переносить вызовreloadSections
для получения анимации. Фактически,performBatchUpdates
в некоторых случаях вызов может вызвать непреднамеренное мерцание / проблемы с изменением размера ячейки.[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
reloadSections
в виде коллекции или в виде таблицы, сделайте это с анимацией.Вот что я сделал, чтобы оживить перезагрузку ВСЕХ РАЗДЕЛОВ:
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]];
Swift 3
let range = Range(uncheckedBounds: (0, collectionView.numberOfSections)) let indexSet = IndexSet(integersIn: range) collectionView.reloadSections(indexSet)
источник
Для пользователей Swift, если в вашем обзоре коллекции есть только один раздел:
self.collectionView.performBatchUpdates({ let indexSet = IndexSet(integersIn: 0...0) self.collectionView.reloadSections(indexSet) }, completion: nil)
Как видно на https://stackoverflow.com/a/42001389/4455570
источник
Перезагрузка всей коллекции внутри
performBatchUpdates:completion:
блока вызывает у меня глючную анимацию на симуляторе iOS 9. Если у вас есть конкретный объект, которыйUICollectionViewCell
вы хотите удалить, или если у вас есть его индексный путь, вы можете вызватьdeleteItemsAtIndexPaths:
этот блок. С его помощьюdeleteItemsAtIndexPaths:
получается плавная и приятная анимация.UICollectionViewCell* cellToDelete = /* ... */; NSIndexPath* indexPathToDelete = /* ... */; [self.collectionView performBatchUpdates:^{ [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]]; // or... [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; } completion:nil];
источник
В справочном тексте говорится:
Я думаю, что ключевая часть "заставляет представление коллекции отбрасывать все видимые в данный момент элементы". Как он будет анимировать движение отброшенных предметов?
источник