UICollectionView と UICollectionViewFlowLayout を使用してフォト ギャラリーを作成しようとしています。アイデアは、垂直スクロールでグリッドに多くの写真を表示することです。ユーザーが 1 つをタップすると、ページング付きの水平、フルスクリーンになります。
私の問題は、ユーザーがフルスクリーン モードでデバイスを回転させ、グリッドからフルスクリーンに切り替えると、アニメーションが非常に醜いことです。
2 つの異なるコレクション レイアウトを使用してそれらを切り替えようとしましたが、問題は残ります。
誰かがこの動作のサンプル アプリケーションを持っているか、その方法を知っている場合は、非常に感謝しています。
これは私が持っているものです。
@interface MovieImagesVC () <UICollectionViewDelegateFlowLayout>
@end
@implementation MovieImagesVC {
UICollectionViewFlowLayout *flowLayout;
int currentIndex;
}
- (void)viewDidLoad
{
[super viewDidLoad];
flowLayout = (UICollectionViewFlowLayout *)self.collectionViewLayout;
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
if (flowLayout.scrollDirection == UICollectionViewScrollDirectionHorizontal) {
collectionView.pagingEnabled = NO;
flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
[flowLayout setMinimumLineSpacing:10.0f];
if (self.interfaceOrientation == UIInterfaceOrientationPortrait ||
self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
flowLayout.itemSize = CGSizeMake(100.f, 100.f);
}
else {
flowLayout.itemSize = CGSizeMake(105.f, 100.f);
}
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
else {
collectionView.pagingEnabled = YES;
flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
[flowLayout setMinimumLineSpacing:0.0f];
flowLayout.itemSize = CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height-20);
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
[self.collectionView.collectionViewLayout invalidateLayout];
[collectionView reloadData];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}
#pragma mark Rotation
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.collectionView.collectionViewLayout invalidateLayout];
if (flowLayout1.scrollDirection == UICollectionViewScrollDirectionHorizontal) {
if (toInterfaceOrientation == UIInterfaceOrientationPortrait ||
toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
flowLayout1.itemSize = CGSizeMake(self.collectionView.frame.size.height, self.collectionView.frame.size.width-20);
}
else {
flowLayout1.itemSize = CGSizeMake(self.collectionView.frame.size.height, self.collectionView.frame.size.width-20);
}
}
else {
if (toInterfaceOrientation == UIInterfaceOrientationPortrait ||
toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
flowLayout1.itemSize = CGSizeMake(100.f, 100.f);
}
else {
flowLayout1.itemSize = CGSizeMake(105.f, 100.f);
}
}
[self.collectionView reloadData];
CGPoint currentOffset = [self.collectionView contentOffset];
currentIndex = currentOffset.x / (int)self.collectionView.frame.size.width;
}
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:currentIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}