Ich habe einen UICollectionViewSubclass mit einem benutzerdefinierten UICOllectionViewLayoutWie Sie sich richtig itemSize von UICollectionViewLayout auf Orientierungsänderung Griff
Wie am besten finde ich die itemSize Veränderung Veränderung auf Orientierung umgehen?
class CollectSubclass: UICollectionView {
/// When orientation changes, then invalidate the layout
open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if ((traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass) || (traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass)) {
collectionViewLayout.invalidateLayout()
}
}
}
Nachdem das Layout auf Orientierungsänderung für ungültig erklärt wird, berechne ich die size.width
der Zelle, auf die der width
des UICollectionView.
Das funktioniert gut, der iPhone 7 Plus-Simulator, aber nicht auf den kleineren Simulatoren wie iPhone 7, 5, SE usw.
Es scheint, dass, sobald die invalidateLayout
genannt wird, wird
/// Lays out subviews.
override open func layoutSubviews() {
super.layoutSubviews()
}
Diese Funktion wiederum ruft die prepare
-Funktion auf der UICollectionViewLayout
-Unterklasse auf, wo ich einen neuen Rahmen der Auflistung verwenden, um die Größe der Zelle zu berechnen.
Auf iPhone-7-Plus wird traitCollectionDidChange
einmal ausgelöst. Und layoutSubviews
wird einmal ausgelöst, was dazu führt, dass prepare
einmal ausgelöst wird.
Bei den kleineren Simulatoren wird traitCollectionDidChange
einmal ausgelöst, aber layoutSubviews
wird zweimal ausgelöst.
Mit dem ersten Trigger von layoutSubviews
ist die UICOlectionView-Rahmengröße fast, was es sein sollte. Und beim zweiten Trigger hat die UICOlectionView-Rahmengröße jetzt die richtige Größe, die es sein sollte.
Wenn zweimal mit zwei verschiedenen Rahmengrößen aufgerufen wird, muss ich das Layout zweimal vorbereiten (was sehr teuer ist).
Gibt es etwas, das ich vermisste, wenn ich UICOllectionViews und UICollectionViewLayouts unterklassifizierte? Jede Hilfe wird geschätzt.
Ich kann auch das Beispielprojekt zur Verfügung stellen, wenn benötigt
Hallo, ich kann die Funktion 'viewWillTransitionToSize' nicht verwenden, da ich eine UICOllectionView-Unterklasse, keine UIViewCOntroller-Unterklasse erstelle. Ich habe keinen Zugriff auf den ViewController (außer nur als schwacher Delegat für die CollectionView) –
Gibt es eine Möglichkeit, die 'viewWillTransitionToSize' zu kennen, ohne einen View-Controller zu verwenden? –
Nein, aber in welcher Ansicht Controller eine Instanz Ihrer Unterklasse 'UICollectionView' instanziiert, können Sie 'viewWillTransitionToSize()' implementieren. Dann rufen Sie in 'viewWillTransitionToSize()' anstelle des Aufrufs von 'setCurrentCollectionCellDimensions (size)' 'collectionView.setCurrentCollectionCellDimensions (size)' auf. Einige Ihrer Logik müssen vom View-Controller stammen und einige davon sind Teil Ihrer UICollectionView-Unterklasse. aber sie können miteinander kommunizieren. – ClayJ