2014-05-19 17 views
6

Mam problem z rozmiarem elementu collectionView. Chcę wyświetlić 3 elementy w wierszu dla trybu Portret i 6 dla krajobrazu. Wcześniej skonfigurować -layoutSubviews tak:Aktualizacja układu UICollectionView - wielkość elementu nie zmienia się

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)) { 
     //Portrait orientation 
     self.flowLayoutPortrait.itemSize = CGSizeMake(106, 106); 

    } else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)) { 
     //Landscape orientation 
     self.flowLayoutPortrait.itemSize = CGSizeMake(93, 93); 
    } 
    [self.collectionView.collectionViewLayout invalidateLayout]; 
} 

Ale wielkość komórek nie zostanie zaktualizowana, to zawsze pozostanie taka sama dla obu kierunków. Jeśli utworzyć 2 flowLayouts i zastosowanie:

[self.collectionView setCollectionViewLayout:self.flowLayoutLandscape]; 

wszystko działa, ale ja naprawdę nie lubię jak są zmieniane. Animacja jest naprawdę zła. A ponieważ itemSize jest jedyną właściwością, która wymaga aktualizacji, użycie 1 układu wydaje się najlepszą opcją.

Jak mogę powiedzieć collectionView, aby zaktualizować układ?

Odpowiedz

12

użyłem tej metody i to było dla mnie bardzo dobrze:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (_isLandscape) 
     return CGSizeMake(yourLandscapeWidth, yourLandscapeHeight); 
    else 
     return CGSizeMake(yourNonLandscapeWidth, yourNonLandscapeHeight); 
} 
+7

Dzięki, działa świetnie! Dla przyszłych czytelników konieczne jest również dodanie '[collectionView.collectionViewLayout invalidateLayout]' w 'willRotateToInterfaceOrientation:' –

0

Może być inna komórka dla trybu portret/krajobraz z różnymi identyfikatorami .. niż po prostu trzeba przeładować dane do widoku kolekcji, niż to z pewnością zadziała.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)) { 
     //Portrait orientation 
     //dequeue cell for portrait mode 

    } else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)) { 
     //Landscape orientation 
     //dequeue cell for landscape mode 
    } 

    return cell; 
} 
Powiązane problemy