Ich benutze ein UICollectionView
mit UICollectionViewFlowLayout
.
Ich stelle die Größe jeder Zelle durch die ein
collectionView:layout:sizeForItemAtIndexPath:
Beim Wechsel von Hoch- zu Querformat möchte ich die Größe jeder Zelle so anpassen, dass sie vollständig der Größe der CollectionView entspricht, ohne dass zwischen den Zellen Platz zum Auffüllen bleibt.
Fragen:
1) Wie ändere ich die Größe einer Zelle nach einem Rotationsereignis?
2) Und noch besser, wie kann man das Layout so gestalten, dass die Zellen immer auf die gesamte Größe des Bildschirms passen?
ios
uicollectionview
uicollectionviewcell
Fmessina
quelle
quelle
sizeForItemAtIndexPath
vor dem Anruf abgefragt wirddidRotateFromInterfaceOrientation
. Bei einer Sammlungsansicht mit mehreren Zellen auf dem Bildschirm führt das Ungültigmachen des Layouts vor dem Drehen jedoch zu einem unangenehmen, sichtbaren Größensprung, bevor sich die Ansicht dreht. In diesem Fall glaube ich, dass meine Antwort immer noch die korrekteste Implementierung ist.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
welche Lösung genau in meiner Antwort vorgeschlagen wurde. Wenn Sie meine Lösung in Ihre Antwort aufnehmen und notieren könnten, welcher Ansatz unter welchen Bedingungen am besten funktioniert, wäre das für mich gut genug.Antworten:
1) Sie können mehrere Layoutobjekte verwalten und austauschen, aber es gibt einen einfacheren Weg. Fügen Sie Ihrer
UICollectionViewController
Unterklasse einfach Folgendes hinzu und passen Sie die Größen nach Bedarf an:Durch Aufrufen
-performBatchUpdates:completion:
wird das Layout ungültig und die Größe der Zellen mit Animation wird geändert (Sie können einfach Null an beide Blockparameter übergeben, wenn Sie keine zusätzlichen Anpassungen vornehmen müssen).2) Anstatt die Elementgrößen fest zu codieren
-collectionView:layout:sizeForItemAtIndexPath
, teilen Sie einfach die Höhe oder Breite der Grenzen der CollectionView durch die Anzahl der Zellen, die auf den Bildschirm passen sollen. Verwenden Sie die Höhe, wenn Ihre collectionView horizontal scrollt, oder die Breite, wenn sie vertikal scrollt.quelle
[self.collectionView.collectionViewLayout invalidateLayout];
?invalidateLayout
werden die Zellen mit der richtigen Größe neu gezeichnet , aber-performBatchUpdates:completion:
die Änderungen werden animiert, was meiner Meinung nach viel besser aussieht.didRotateFromInterfaceOrientation
veraltet in iOS 8coordinator.animateAlongsideTransition
anviewWillTransitionToSize
und rufeperformBatchUpdates
innerhalb seinesanimation
Blocks an. Dies ergibt einen schönen Animationseffekt.Wenn Sie keine zusätzlichen Animationen benötigen , erzwingen Sie
performBatchUpdates:completion:
einfachinvalidateLayout
das Neuladen des collectionViewLayout.quelle
Ich habe mit zwei UICollectionViewFlowLayout gelöst. Eine für Porträt und eine für Landschaft. Ich ordne sie meiner collectionView in -viewDidLoad zu
Dann habe ich einfach meine collectionViewFlowLayoutDelgate-Methoden wie folgt geändert
Zuletzt wechsle ich beim Drehen von einem Layout zu einem anderen
quelle
Es gibt eine einfache Möglichkeit, die Zellengröße der Sammlungsansicht festzulegen:
Ich bin mir nicht sicher, ob es animierbar ist.
quelle
Swift: Sammlungsansichtszelle, die n% der Bildschirmhöhe beträgt
Ich brauchte eine Zelle, die einen bestimmten Prozentsatz der Ansichtshöhe hatte und deren Größe sich mit der Gerätedrehung ändern würde.
Mit Hilfe von oben ist hier die Lösung
quelle
Wenn Sie verwenden.
autolayout
Sie müssen sichinvalidate layout
beim Drehen nur in Ihrem Ansichts-Controller befinden undoffset
in Ihrer Unterklasse für das Flusslayout anpassen .Also, in Ihrer Ansicht Controller -
Und in deinem
FlowLayout Subclass
quelle
willRotateToInterfaceOrientation
ist in iOS 8 veraltet,viewWillTransitionToSize
funktioniert aber genauso gut.