Używam UICollectionView
z UICollectionViewFlowLayout
.
Rozmiar każdej komórki ustawiam za pomocą
collectionView:layout:sizeForItemAtIndexPath:
Podczas przełączania się z pionowej na poziomą chciałbym dostosować rozmiar każdej komórki, aby całkowicie dopasować rozmiar CollectionView, bez pozostawiania odstępu między komórkami.
Pytania:
1) Jak zmienić rozmiar komórki po zdarzeniu rotacji?
2) A jeszcze lepiej, jak zrobić układ, w którym komórki zawsze mieszczą się na całym ekranie?
ios
uicollectionview
uicollectionviewcell
Fmessina
źródło
źródło
sizeForItemAtIndexPath
przed wywołaniem będzie wysyłał zapytaniadidRotateFromInterfaceOrientation
. Jednak w przypadku widoku kolekcji z wieloma komórkami na ekranie unieważnienie układu przed obróceniem powoduje nieprzyjemny, widoczny skok rozmiaru przed obróceniem widoku. W tym przypadku uważam, że moja odpowiedź jest nadal najbardziej poprawną implementacją.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
które dokładnie rozwiązanie zaproponowałem w mojej odpowiedzi. Gdybyś mógł zawrzeć moje rozwiązanie w swojej odpowiedzi i zanotować, które podejście działa najlepiej w jakich warunkach byłoby to dla mnie wystarczająco dobre.Odpowiedzi:
1) Możesz obsługiwać i zamieniać wiele obiektów układu, ale jest prostszy sposób. Po prostu dodaj następujące elementy do swojej
UICollectionViewController
podklasy i dostosuj rozmiary zgodnie z wymaganiami:Powołanie
-performBatchUpdates:completion:
unieważni układ i zmieni rozmiar komórek za pomocą animacji (możesz po prostu przekazać zero do obu parametrów bloku, jeśli nie masz żadnych dodatkowych zmian do wykonania).2) Zamiast zakodować na stałe rozmiary elementów w
-collectionView:layout:sizeForItemAtIndexPath
, po prostu podziel wysokość lub szerokość granic collectionView przez liczbę komórek, które chcesz zmieścić na ekranie. Użyj wysokości, jeśli collectionView przewija się w poziomie lub szerokości, jeśli przewija się w pionie.źródło
[self.collectionView.collectionViewLayout invalidateLayout];
?invalidateLayout
spowoduje ponowne narysowanie komórek o prawidłowym rozmiarze, ale-performBatchUpdates:completion:
ożywi zmiany, co wygląda o wiele ładniej IMHO.didRotateFromInterfaceOrientation
przestarzałe w iOS 8coordinator.animateAlongsideTransition
wviewWillTransitionToSize
, i powołanieperformBatchUpdates
w jejanimation
bloku. Daje to ładny efekt animacji.Jeśli nie chcesz, aby dodatkowe animacje zostały wprowadzone
performBatchUpdates:completion:
, po prostu użyj,invalidateLayout
aby wymusić ponowne załadowanie collectionViewLayout.źródło
Rozwiązałem za pomocą dwóch UICollectionViewFlowLayout. Jeden do portretu i jeden do krajobrazu. Przypisuję je do mojej kolekcji dynamicznie w -viewDidLoad
Następnie po prostu zmodyfikowałem moje metody collectionViewFlowLayoutDelgate w ten sposób
Ostatnio zmieniam układ na inny podczas obracania
źródło
Istnieje prosty sposób ustawienia rozmiaru komórki widoku kolekcji:
Nie jestem pewien, czy można go animować.
źródło
Swift: Collection View Cell, czyli n% wysokości ekranu
Potrzebna mi była komórka, która miała określony procent wysokości wyświetleń i będzie zmieniać rozmiar wraz z obrotem urządzenia.
Z pomocą z góry oto rozwiązanie
źródło
Jeśli używasz
autolayout
. Wystarczy, że użyjeszinvalidate layout
kontrolera widoku podczas obracania i dostosowywaniaoffset
w podklasie układu przepływu.Więc Twoim zdaniem kontroler -
I w twoim
FlowLayout Subclass
źródło
willRotateToInterfaceOrientation
jest przestarzały w iOS 8, aleviewWillTransitionToSize
działa równie dobrze w tym przypadku.