Blog

Zwänge mit einer einfachen UIView-Erweiterung in Swift animieren

Lammert Westerhoff

Lammert Westerhoff

Aktualisiert Oktober 22, 2025
3 Minuten

iOS-Entwickler, die zum ersten Mal mit Auto-Layout arbeiten, stoßen oft auf Probleme, 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 es noch einfacher macht.

Wenn Sie Auto-Layout nicht verwenden, müssen Sie die Änderungen an Ihren UIView-Rahmen innerhalb eines Animationsblocks vornehmen. Diese Änderungen werden dann animiert. Ohne es besser zu wissen, würden Sie also dasselbe für Ihre Auto-Layout-Beschränkungen tun, d.h. die Beschränkungskonstanten innerhalb des Animationsblocks ändern. Das funktioniert jedoch nicht, und eine kurze 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 hierfür: [objc] heightConstraint.constant = 100 UIView.animateWithDuration(0.5, animations: { [weak self] in self?.view.layoutIfNeeded() ??[/objc]() }) ist es notwendig, es so aufzurufen, da die Aktualisierung von Konstanten von Constraints nicht sofort die Frames der von diesen Constraints betroffenen Views ändert. Deshalb müssen wir layoutIfNeeded aufrufen, um alle Frames unserer Views zu aktualisieren.Da wir bei der Speicherverwaltung auf Nummer sicher gehen wollen, verwenden wir eine schwache Referenz von self innerhalb der Closure, obwohl wir wissen, dass die Closure nach dem Ablauf der Animation nicht beibehalten wird und die View nicht freigegeben wird, bevor die Animation beendet ist (es ist eine gute Praxis, wann immer es möglich ist, schwache Referenzen zu verwenden, um speicherbezogene Probleme zu vermeiden).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 das Folgende zu schreiben? [objc] heightConstraint.constant = 100 view.animateConstraintWithDuration() [/objc] Das können wir erreichen, indem wir eine Erweiterung zu UIView hinzufügen: [objc] extension UIView { func animateConstraintWithDuration(duration: NSTimeInterval = 0.5) { UIView.animateWithDuration(duration, animations: { [weak self] in self?.layoutIfNeeded() ??[/objc]() }) } } Standardwerte für die Methodenparameter machen das Ganze noch netter. Oben haben wir 0,5 als Standarddauer verwendet, aber natürlich können Sie die gewünschte Dauer beim Aufruf der Methode eingeben. Wir können auch Parameter mit Standardwerten für die anderen Parameter hinzufügen, die animateWithDuration hat.

Die endgültige Verlängerung

[objc] extension UIView { func animateConstraintWithDuration(duration: NSTimeInterval = 0.5, delay: NSTimeInterval = 0.0, options: UIViewAnimationOptions = nil, completion: ((Bool) -> Void)? = nil) { UIView.animateWithDuration(duration, delay:delay, options:options, animations: { [weak self] in self?.layoutIfNeeded() ?? () }, completion: completion) } } [/objc] Da haben wir es. Eine extrem einfache Erweiterungsmethode, die uns nicht nur jedes Mal, wenn wir Einschränkungen animieren müssen, ein wenig Code erspart, sondern den Code auch viel sauberer macht, da der Name der Methode klar angibt, was sie tut, im Gegensatz zur Methode layoutIfNeeded innerhalb eines Animationsblocks.

Verfasst von

Lammert Westerhoff

Contact

Let’s discuss how we can support your journey.