ios - titles - xcode big title




Изменение пользовательских данных UICollectionView (6)

В моем проекте я использую 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:] для выполнения анимации для изменения или есть лучший метод?

Я не получил много в subclassing collectionViews, поэтому любая помощь будет отличной ...

Спасибо, Билл.


Wrapping -reloadData in -reloadData -performBatchUpdates: похоже, не вызывает -reloadData просмотр коллекции для анимации.

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadData];
} completion:nil];

Однако этот код работает:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:nil];

reloadData не оживляет, и не делает это с надежностью, если положить в блок анимации UIView. Он хочет быть в блоке executeBatchUpdates UICollecitonView, поэтому попробуйте что-то еще:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadData];
} completion:^(BOOL finished) {}];

Для пользователей Swift, если ваш сборник имеет только один раздел:

self.collectionView.performBatchUpdates({
                    let indexSet = IndexSet(integersIn: 0...0)
                    self.collectionView.reloadSections(indexSet)
                }, completion: nil)

Как видно на https://.com/a/42001389/4455570


Если вы хотите больше контроля и настраиваемой функции, проверьте this , он содержит очень подробное объяснение различных способов анимации UICollectionViewCell.


Текст справки гласит:

Вызовите этот метод для перезагрузки всех элементов в представлении коллекции. Это приводит к тому, что представление коллекции отменяет любые видимые в данный момент элементы и повторно отображает их. Для эффективности в представлении коллекции отображаются только те ячейки и дополнительные виды, которые видны. Если данные сбора сжимаются в результате перезагрузки, представление коллекции соответственно корректирует смещения прокрутки. Вы не должны вызывать этот метод в середине блоков анимации, где элементы вставляются или удаляются. Вставки и удаления автоматически заставляют данные таблицы обновляться соответствующим образом.

Я думаю, что ключевая часть «заставляет коллекцию просматривать отбросить все видимые в данный момент элементы». Как это будет оживлять движение предметов, которые оно отбросило?


Это то, что я сделал, чтобы оживить перезагрузку ВСЕХ СЕКЦИЙ:

[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)




uicollectionview