我解決了使用兩個UICollectionViewFlowLayout。一個用於肖像,另一個用於景觀。我把它們dinamically分配給我的CollectionView在-viewDidLoad
self.portraitLayout = [[UICollectionViewFlowLayout alloc] init];
self.landscapeLayout = [[UICollectionViewFlowLayout alloc] init];
UIInterfaceOrientation orientationOnLunch = [[UIApplication sharedApplication] statusBarOrientation];
if (UIInterfaceOrientationIsPortrait(orientationOnLunch)) {
[self.menuCollectionView setCollectionViewLayout:self.portraitLayout];
} else {
[self.menuCollectionView setCollectionViewLayout:self.landscapeLayout];
}
然後,我只是修改了collectionViewFlowLayoutDelgate方法這樣
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize returnSize = CGSizeZero;
if (collectionViewLayout == self.portraitLayout) {
returnSize = CGSizeMake(230.0, 120.0);
} else {
returnSize = CGSizeMake(315.0, 120.0);
}
return returnSize;
}
最後我從佈局到另一個開啓旋轉
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
if (UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) {
[self.menuCollectionView setCollectionViewLayout:self.landscapeLayout animated:YES];
} else {
[self.menuCollectionView setCollectionViewLayout:self.portraitLayout animated:YES];
}
}
followben的答案是目前公認的一個,但它有一些問題:它會拋出一個控制檯錯誤和動畫,新的大小將無法正常發生。看到我的答案正確的實施。 – memmons
@ MichaelG.Emmons:如果集合視圖一次只顯示一個全尺寸的單元格,您的答案將會更好。在這種情況下,UIKit抱怨旋轉是有道理的,因爲在調用'didRotateFromInterfaceOrientation'之前它將查詢'sizeForItemAtIndexPath'。 但是,對於屏幕上具有多個單元格的集合視圖,在旋轉之前使佈局無效將在視圖旋轉之前導致大小令人討厭的可見跳轉。在這種情況下,我相信我的答案仍然是最正確的實施。 – followben
@followben同意每個人在不同的使用案例中都有自己的問題。在這種情況下,OP表示「我想調整每個單元格的大小,使其完全符合CollectionView **的大小,這正是我答案中提出的解決方案。如果你可以在你的答案中包括我的解決方案,並記下哪種方法最適合我的條件。 – memmons