UIButton Animation in Swift 4

Marian König
2 min readJan 31, 2019

--

Animationen hauchen Apps Leben ein und können in der Gunst des Nutzers den feinen Unterschied machen. Für eine Todo-List-App habe ich deshalb einem Check-Button etwas Bouncyness verpasst.

Animierter UIButton zum Abhaken des Tasks

Der Prototyp ist in einem Xcode Playground entstanden. Den File und den kompletten Code gibt‘s hier.

Der Knackpunkt der Animation ist wie so oft das richtige Timing.

Im ersten Animationsschritt muss der Button zunächst durch eine lineare Animation von seiner Ausgangsform des abgerundeten Rechtecks in einen Kreis transformiert werden. Zudem wird der Text des Titellabels ausgeblendet, da dieser zum einen zu groß für die neue Form ist und zum anderen unschöne Überlappungen verursacht. Auch die neue Hintergrundfarbe wird bereit im ersten Animationsschritt gesetzt. Der runde Button wird schließlich auf 80% seiner Größe skaliert, um ihn im nächsten Step schließlich wieder dynamisch vergrößern zu können.

Lineare Animation

Der zweite Animationsschritt wird durch den Completion Handler des UIViewPropertyAnimators getriggert. Hierbei wird der eigentliche Bounce des Buttons durch eine Spring Animation bewerkstelligt. Das Konzept hinter dieser Animationsart liegt darin, dass diese nicht linear verläuft, sondern mit einem hohen Ausschlag beginnt und basierend auf dem gegebenen Dämpfungsgrad (Damping) und der Anfangsgeschwindigkeit (Velocity) an Intensität verliert. Im gleichen Atemzug wird das Titellabel wieder eingeblendet, aufgrund der neuen Hintergrundfarbe weiß gefärbt und mit dem simplen Hakensymbol versehen. Das Label wird ebenso federnd skaliert und fügt sich somit nahtlos in die Animation ein.

Spring Animation

Der Button kann dann durch das Setzen der Ausgangswerte in einer zweiten Funktion restoreButton() erneut in den Startzustand versetzt werden. Ich habe die Intensität der Spring Animation dabei durch das Herabsetzen der Velocity etwas reduziert, wodurch der Button etwas gediegener in seinen Initialzustand versetzt wird.

--

--

Marian König
Marian König

No responses yet