Анимация кадра и изменение макета UICollectionView
Я пытаюсь создать эффект, когда я изменяю макет своего UICollectionView при изменении размера кадра
Первоначально макет collectionView представляет собой полноэкранный стиль галереи "thumbnail".
После изменения размера рамки на тонкую полоску - я хотел бы представить макет стиля "полоска фильма"
оба макета независимо работают нормально и как ожидалось.
Я попробовал код, похожий на этот:
[UIView animateWithDuration:1
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.collectionview.frame = newFrame; // animate the frame size
}
completion:^(BOOL finished) {
[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView setCollectionViewLayout:filmstriplayout animated:YES]; // now set the new layout
}];
Но он выглядит очень изменчивым и не изменяет размер, как ожидалось.
Есть ли способ, которым я мог бы изменить макет коллекции и размер кадра одновременно во время анимации изменения?
Ответы
Ответ 1
У меня нет конкретного ответа, но несколько советов для рассмотрения.
UICollectionView
не всегда корректно обрабатывает экземпляры макета. Вот хорошее обсуждение проблемы и некоторые обходные пути.
Но то, что я на самом деле делал на практике, работало для меня, было реализовать оба макета в одном классе, который знает, как переключаться между режимами макета. Я обнаружил, что режимы переключения макета в блоке обновления пакета были менее проблематичными, чем использование setCollectionViewLayout
с двумя разными экземплярами макета:
[self.collectionView performBatchUpdates:^{
MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
layout.mode = otherLayoutMode;
} completion:nil];
Ответ 2
Сначала установите размер элемента сетки, например gridItemSize = CGSizeMake(98, 98);
, затем выполните пакетное действие UICollectionView. Элементы в виде коллекции меняют свои размеры с помощью анимации.:)
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(gridItemSize.width, gridItemSize.height);
}
[self.collectionview performBatchUpdates:^{
[self.collectionview.collectionViewLayout invalidateLayout];
[self.collectionview setCollectionViewLayout:self.collectionview.collectionViewLayout animated:YES];
} completion:^(BOOL finished) {
}];
Ответ 3
Вот простой трюк, когда вы обновляете CollectionView, используйте это:
[self.collectionView removeFromSuperview]; //First remove the Collection View
//Relocate the view with layouts
UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
layout.minimumInteritemSpacing = 10;
layout.minimumLineSpacing = 10;
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.width,100) collectionViewLayout:layout];
[self.collectionView setDataSource:self];
[self.collectionView setDelegate:self];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.collectionView reloadData];
[self.view addSubview:self.collectionView];