2014-05-19 14 views
6

Sto riscontrando un problema con la dimensione dell'elemento di collectionView. Voglio visualizzare 3 elementi in fila per la modalità verticale e 6 per orizzontale. Ho installato -layoutSubviews come questo:UICollectionVisualizzazione del layout di Vista - La dimensione dell'articolo non cambia

- (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]; 
} 

Ma le dimensioni delle cellule non viene aggiornato, sempre rimanere lo stesso per entrambi gli orientamenti. Se creo 2 flowLayouts e l'uso:

[self.collectionView setCollectionViewLayout:self.flowLayoutLandscape]; 

tutto funziona, ma davvero non mi piace il modo in cui vengono modificati. L'animazione è davvero pessima. E poiché itemSize è l'unica proprietà che deve essere aggiornata, l'utilizzo di 1 layout sembra l'opzione migliore.

Come posso dire a collectionView di aggiornare il layout?

risposta

12

Ho usato questo metodo e questo è stato per me molto fine:

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

Grazie, questo funziona benissimo! Per i futuri lettori, è anche necessario aggiungere '[collectionView.collectionViewLayout invalidateLayout]' in 'willRotateToInterfaceOrientation:' –

0

Può essere possibile selezionare una cella diversa per la modalità verticale/orizzontale con identificatori diversi. di quanto non sia necessario ricaricare i dati per la vista di raccolta di quanto funzioni definitivamente.

- (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; 
} 
Problemi correlati