2015-03-13 10 views
16

Obecnie mam następujący fragment obliczania UICollectionViewCells rozmiarach:UICollectionView Invalidate Układ Na Bounds Zmiany

- (CGSize)collectionView:(UICollectionView *)mainCollectionView 
        layout:(UICollectionViewLayout *)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)atIndexPath 
{ 
    CGSize bounds = mainCollectionView.bounds.size; 
    bounds.height /= 4; 
    bounds.width /= 4; 
    return bounds; 
} 

To działa. Jednak teraz dodałem obserwatora klawiatury w viewDidLoad (który uruchamia metodę delegata i źródła danych dla UICollectionView zanim pojawi się i zmieni rozmiar z storyboardu). Granice są zatem błędne. Chciałbym także wspierać rotację. Jaki jest dobry sposób postępowania z tymi dwoma skrajnymi przypadkami i ponowne obliczenie rozmiarów, jeśli rozmiar UICollectionView zmienia się?

Odpowiedz

38

Roztwór do unieważniania układ gdy granice kolekcji widzenia zmian jest przesłonić shouldInvalidateLayoutForBoundsChange: i powrócić YES. Jest również wskazane w dokumentacji: https://developer.apple.com/documentation/uikit/uicollectionviewlayout/1617781-shouldinvalidatelayoutforboundsc

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 
{ 
    return YES; 
} 

ta powinna obejmować wsparcie obrotu, jak również. Jeśli nie, to wdrożenie viewWillTransitionToSize:withTransitionCoordinator:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size 
      withTransitionCoordinator:coordinator]; 

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
     [self.collectionView.collectionViewLayout invalidateLayout]; 
    } 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
    }]; 
} 
+1

Animuj obok przejścia ... jest genialny. Dziękuję Ci! – 3rdFunkyBot

7
  1. Powinieneś obsłużyć przypadek, gdy zmieni się rozmiar widoku kolekcji. Po zmianie orientacji lub wiązań zostanie wywołana metoda viewWillLayoutSubviews.

  2. Należy unieważnić bieżący układ widoku kolekcji. Po unieważnieniu układu przy użyciu metody invalidateLayout zostaną uruchomione metody UICollectionViewDelegateFlowLayout.

Oto przykładowy kod:

 
- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    [mainCollectionView.collectionViewLayout invalidateLayout]; 
} 
+9

gdy próbowałem, że moja aplikacja powiesić z powodu metody '-viewWillLayoutSubviews' wywoływana jest nieskończenie .. ja umieścić ten kod w złym sterownikiem? Czy mogę też wywołać super? – igrek

+0

Jest to również przydatne, gdy potrzebujesz niestandardowych układów w widoku z paska zakładek kontrolerów A, B i C, tak, że gdy używasz VC A i obracasz, potrzebujesz VC B, aby zaktualizować swój układ tak, aby użytkownik przechodząc do VC B, nadal wyświetla się prawidłowo obrócony widok. – JohnZ

Powiązane problemy