iOS Entwickler, die zum ersten Mal mit Auto-Layout beginnen, geraten oft in Schwierigkeiten, wenn sie versuchen, ihre Ansichten zu animieren. Die Lösung ist recht einfach, aber in diesem Beitrag werde ich eine einfache Swift-Erweiterung erstellen, die ihnen das Leben noch leichter macht.

UIView-Extension Swift

Wenn Sie kein Auto-Layout verwenden, müssen Sie die Änderungen an ihren UIView-Frames innerhalb eines Animationsblocks vornehmen. Diese Änderungen werden dann animiert. Ohne es besser zu wissen, würden Sie dasselbe für ihre Auto-Layout-Constraints tun, was bedeutet, dass Sie die Constraint-Konstanten innerhalb des Animationsblocks ändern müssen.

Dies funktioniert jedoch nicht und eine schnelle Google-Suche nach „wie man Constraints animiert“ zeigt, dass Sie nur view.layoutifNeeded innerhalb des Animationsblocks aufrufen müssen, nachdem Sie die Änderungen an den Constraints vorgenommen haben.

Ein einfaches Beispiel dafür ist:

Copy to Clipboard

Es ist notwenig, dieses als wat zu bezeichnen, da das Aktualisieren von Konstanten von Constraints nicht sofort die Frames der von diesen Constraints betroffenen Views verändert. Deshalb müssen wir layoutIfNeeded aufrufen, um alle Frames unserer Ansichten zu aktualisieren.

Da wir mit der Speicherverwaltung immer sicher sein wollen, verwenden wir eine schwache Selbstreferenz innerhalb der Schließung, auch wenn wir wissen, dass die Schließung nach dem Ausführen der Animation nicht beibehalten wird und die Ansicht nicht vor dem Ende der Animation deaktiviert wird.

Das obige Beispiel ist nicht viel Code, aber jedes Mal, wenn Sie etwas mit Constraints animieren wollen, müssen Sie dasselbe schreiben. Wäre es nicht viel einfacher, stattdessen folgendes zu schreiben?

Copy to Clipboard

Wir können das erreichen, indem wir eine Erweiterung zu UIView hinzufügen:

Copy to Clipboard

Vorschlagswerte für die Methodenparameter machen dies noch schöner. Oben haben wir 0.5 als Standarddauer verwendet, aber natürlich können Sie die gewünschte Dauer beim Aufruf der Methode angeben. Auch können wir Paramter mit Standardwerten für die anderen Parameter hinzufügen, die animateWithDuration hat.

Die finale Extension.

Copy to Clipboard

Da haben wir es. Eine extrem einfache Erweiterungsmethode, die uns nicht nur jedes Mal ein wenig Code einspart, wenn wir Constraints animieren müssen, sondern den Code auch viel sauberer macht, da der Name der Methode deutlich anzeigt, was dieser tut, wie es bei der Methode layoutIfNeeded innerhalb eines Animationsblocks der Fall ist.