2012-12-06 9 views
40

Moje komórki UICollectionView zawierają z tekstem wielowierszowym. Nie wiem, czy height z UICollectionViewCells, dopóki tekst nie został ustawiony na UILabel.Zmiana rozmiaru komórek UICollectionView po ustawieniu ich danych

-(CGSize)collectionView:(UICollectionView *)collectionView 
       layout:(UICollectionViewLayout*)collectionViewLayout 
sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 

Czy początkowa metoda Spojrzałem na celu doboru UICollectionViewCells, jednak jest to tzw PRZED komórki są tworzone z UIStoryboard. Czy istnieje sposób na uporządkowanie kolekcji i rozmiar komórek po ich renderowaniu, a ja znam rzeczywisty rozmiar komórki?

+0

To wygląda jak najlepsze rozwiązanie tego problemu - http: // stackoverflow.com/a/19518480/2147976 – codeburn

Odpowiedz

65

Myślę, że szukasz sposobu invalidateLayout można zadzwonić na posesji swojego UICollectionView .collectionViewLayout. Ta metoda regeneruje twój układ, co w twoim przypadku oznacza także wywołanie -collectionView: layout: sizeForItemAtIndexPath:, które jest właściwym miejscem do odzwierciedlenia pożądanego rozmiaru przedmiotu. Jirune wskazuje właściwy kierunek ich obliczania.

Przykład użycia invalidateLayout można znaleźć here. Zobacz także dokumentację UICollectionViewLayout na temat tej metody:

Unieważnia bieżący układ i uruchamia aktualizację układu.

Dyskusja:

można wywołać tej metody w dowolnym momencie zaktualizować informacje o układzie. Ta metoda powoduje unieważnienie układu samego widoku kolekcji i natychmiast zwraca. W ten sposób można wielokrotnie wywoływać tę metodę z tego samego bloku kodu bez uruchamiania wielu aktualizacji układu. Faktyczna aktualizacja układu występuje podczas następnego cyklu aktualizacji układu widoku.

Edit:

Dla ujęć widzenia zbiórki, która zawiera ograniczenia auto układu, trzeba zastąpić viewDidLayoutSubviews metodę UIViewController i nazywają invalidateLayout zbiórki Widok układu w tej metodzie.

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    [yourCollectionView.collectionViewLayout invalidateLayout]; 
} 
+0

Podążam za twoim podejściem do realizacji, jest jeden problem, który spotkałem: po wywołaniu 'invalidateLayout' czasami komórki znikają/stają się niewidoczne, więc nie mogę ich dostać w' sizeForItemAtIndexPath' z 'cellForItemAtIndexPath'. Przy okazji używam komórek, by uzyskać ich rozmiar, nie mam dla nich oddzielnego sklepu. –

+0

cool thx! o wiele lepiej niż przeładowanie danych. – Raegtime

+0

Awesome! Utknąłem na szerokości komórki, która nie uległa zmianie, ponieważ jest przypisana przez układ automatyczny, ale po przeczytaniu tego rozwiązania wymyśliłem to. P.S. Wpisuję kod do kwestii automatycznego układu, mam nadzieję, że nie masz nic przeciwko. – Kampai

4

Hey w powyższym delegate samej metody, można obliczyć wielkość UILabel pomocą poniżej trudną drogę i powrót UICollectionViewCellsize podstawie tego obliczenia.

// Calculate the expected size based on the font and 
    // linebreak mode of your label 
    CGSize maximumLabelSize = CGSizeMake(9999,9999); 

    CGSize expectedLabelSize = 
    [[self.dataSource objectAtIndex:indexPath.item] 
      sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] 
     constrainedToSize:maximumLabelSize 
      lineBreakMode:NSLineBreakByWordWrapping]; 
3

podklasa UICollectionViewCell i zastąpić layoutSubviews jak ten

niniejszym będziesz kotwica komórki prowadzącego i krawędzi spływu do CollectionView

override func layoutSubviews() { 
     super.layoutSubviews() 

     self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height) 
    } 
0
- (void)viewDidLoad { 
    self.collectionView.prefetchingEnabled = NO; 
} 

W iOS 10 prefetchingEnabled jest YES domyślnie . Gdy YES, widok kolekcji żąda komórek z wyprzedzeniem, kiedy będą wyświetlane. Prowadzi do awarii w iOS 10

+1

Chociaż ten fragment kodu jest mile widziany i może zapewnić pomoc, byłby [znacznie poprawiony, gdyby zawierał wyjaśnienie] (// meta.stackexchange.com/q/114762) * how * and * why * to rozwiązuje problem. Pamiętaj, że odpowiadasz na pytanie dla czytelników w przyszłości, a nie tylko pytasz teraz! Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie i podać, jakie ograniczenia i założenia mają zastosowanie. –

+0

@ TobySpeight W iOS10 parametr prefetchingEnabled ma wartość YES. Gdy TAK, widok kolekcji żąda komórek z góry przed wyświetleniem. Prowadzi to do awarii w iOS10 –

+0

To wygląda na dobre wyjaśnienie - proszę ** [edytuj] ** twoja odpowiedź na to. Dzięki! –