UIView.animate: co to jest, animacja właściwości UIView w iOS

Autor: IT Sectr Opublikowano: 2026-03-01 Czas czytania: 8 min

UIView.animate — podstawowa metoda animacji właściwości UIView w iOS, zaimplementowana w UIKit poprzez bloki z duration, delay i options. Metoda animuje frame, alpha, transform, backgroundColor i inne animowalne właściwości. Artykuł opisuje składnię, parametry, praktyczne przykłady i wewnętrzną strukturę animacji UIKit.

Najważniejsze

  • UIView.animate — blokowa metoda animacji właściwości UIView: frame, alpha, transform, backgroundColor
  • Parametry — duration (sek), delay (sek), options (krzywa, powtórzenie, automatyczny odwrót), completion (domknięcie)
  • Animacja sprężyny — UIView.animate(withDuration:delay:usingSpringWithDamping:) z fizycznym odbiciem
  • Animacja keyframe — UIView.animateKeyframes dla wieloetapowych sekwencji z względnym czasem
  • Core Animation — pod maską UIView.animate używa CABasicAnimation na poziomie CALayer

Co to jest UIView.animate?

UIView.animate — statyczna metoda klasy UIView, wprowadzona w iOS 4 (2010). Zapewnia deklaratywne API do animacji animowalnych właściwości UIView: frame, bounds, center, alpha, transform, backgroundColor. Metoda przyjmuje blok (domknięcie) ze zmianami właściwości — system automatycznie tworzy CABasicAnimation dla każdej zmienionej właściwości.

Składnia blokowa zastąpiła starą beginAnimations/commitAnimations (iOS 2-3) i stała się standardem animacji w UIKit. Animacje UIView.animate są wykonywane na głównym wątku i nie blokują UI. Domyślnie czas trwania animacji wynosi 0.25 sekundy z krzywą easeInOut.

Według danych Apple WWDC 2023, zalecanym sposobem animacji w nowych projektach jest SwiftUI z modyfikatorami .animation() i .transition(), ale UIKit.animate pozostaje głównym narzędziem do obsługi iOS 16 i starszych, a także do złożonych niestandardowych przejść.

Parametry i opcje animacji

UIView.animate udostępnia trzy kluczowe parametry: duration (czas trwania w sekundach), delay (opóźnienie przed rozpoczęciem) i options (zestaw masek bitowych UIView.AnimationOptions). Options obejmują curve (easeInOut, easeIn, easeOut, linear), repeat (powtórzenie), autoreverse (automatyczny odwrót), allowUserInteraction, beginFromCurrentState i overrideInheritedDuration.

ParametrTypOpis
durationTimeIntervalCzas trwania animacji w sekundach (typ Double)
delayTimeIntervalOpóźnienie przed rozpoczęciem animacji
optionsUIView.AnimationOptionsMaska bitowa: curve, repeat, autoreverse, layoutSubviews
animations() -> VoidBlok ze zmianami animowalnych właściwości
completion(Bool) -> VoidDomknięcie po zakończeniu animacji

Parametr options jest łączony przez tablicę: [.curveEaseOut, .repeat, .autoreverse]. Animacja z repeat i autoreverse płynnie przywraca View do stanu początkowego i powtarza się w nieskończoność. Dla skończonej liczby powtórzeń użyj animateKeyframes.

Animacja sprężyny przez UIView.animate

Animacja sprężyny dodaje fizyczny efekt sprężyny: obiekt nie tylko przechodzi z punktu A do B, ale „przelatuje" cel z tłumionymi oscylacjami. Parametry: usingSpringWithDamping (tłumienie 0-1, gdzie 0 — maksymalne oscylacje) i initialSpringVelocity (prędkość początkowa sprężyny).

Apple zaleca usingSpringWithDamping w zakresie 0.4-0.8 dla naturalnych animacji UI. Wartość 0.5 tworzy zauważalne odbicie bez uczucia „gumowatości". initialSpringVelocity = 1.0 odpowiada prędkości 1 pt/sek. Przy 0 animacja startuje ze stanu spoczynku.

swift
// Przykład animacji sprężyny i keyframe
import UIKit

class AnimatedView: UIView {

    func springBounce() {
        // Animacja sprężyny z tłumieniem
        UIView.animate(
            withDuration: 0.8,
            delay: 0,
            usingSpringWithDamping: 0.5,
            initialSpringVelocity: 1.0,
            options: [.allowUserInteraction],
            animations: {
                self.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
                self.alpha = 0.7
            },
            completion: { _ in
                UIView.animate(withDuration: 0.3) {
                    self.transform = .identity
                    self.alpha = 1.0
                }
            }
        )
    }

    func slideIn(from offset: CGFloat) {
        self.transform = CGAffineTransform(translationX: offset, y: 0)
        self.alpha = 0.0

        UIView.animate(
            withDuration: 0.6,
            delay: 0.1,
            options: [.curveEaseOut]
        ) {
            self.transform = .identity
            self.alpha = 1.0
        }
    }
}

Animacja keyframe

UIView.animateKeyframes pozwala podzielić animację na kilka kroków (keyframes), każdy z własnym względnym czasem i czasem trwania. Metoda addKeyframe(withRelativeStartTime:relativeDuration:) przyjmuje wartości czasowe od 0 do 1 względem całkowitego czasu trwania animacji.

Animacje keyframe są przydatne do wieloetapowych efektów: pulsowanie przycisku (powiększenie → pauza → powrót), sekwencyjne pojawianie się elementów, złożone deformacje z pośrednimi stanami. Każdy keyframe może mieć własną krzywą animacji przez options.

swift
// Animacja keyframe ze złożoną sekwencją
func complexPulse() {
    UIView.animateKeyframes(withDuration: 2.0, delay: 0, options: [.repeat]) {
        UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.25) {
            self.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
            self.alpha = 0.5
        }
        UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.25) {
            self.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
            self.alpha = 0.8
        }
        UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
            self.transform = .identity
            self.alpha = 1.0
        }
    }
}

// Animacja z zagnieżdżonymi domknięciami
func animateCardTransition() {
    UIView.animate(withDuration: 0.4, delay: 0, options: [.curveEaseOut]) {
        self.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
    } completion: { _ in
        UIView.animate(withDuration: 0.3, delay: 0, options: [.curveEaseIn]) {
            self.transform = .identity
        }
    }
}

Wewnętrzna struktura: Core Animation pod maską

Pod maską UIView.animate deleguje animację do CALayer każdego UIView przez Core Animation (CAAnimation). Kiedy zmieniasz frame wewnątrz bloku animacji, system tworzy CABasicAnimation dla właściwości position i bounds odpowiedniej warstwy. Jeśli zmieniasz alpha — CABasicAnimation dla właściwości opacity warstwy.

Core Animation używa osobnego procesu render server (backboardd na iOS), który przetwarza animacje z częstotliwością 120 Hz (ProMotion). UIView.animate nie blokuje głównego wątku — zmiany właściwości są wysyłane do render server, który interpoluje klatki bez udziału aplikacji.

Według Apple, animacje przez UIView.animate mają narzut ~2-3% CPU na każdą zmienioną warstwę przy 60 FPS. Dla masowych animacji (20+ obiektów jednocześnie) zaleca się użycie CATransaction i ręczne zarządzanie warstwami.

Do debugowania i wizualizacji animacji UIKit używaj Xcode Debug View Hierarchy — pokazuje aktywne CAAnimations na każdej warstwie, ich czas trwania, krzywą i bieżący stan. Zrozumienie wewnętrznej struktury Core Animation pomaga uniknąć problemów z wydajnością przy złożonych animacjach i wybrać optymalne podejście między UIView.animate a bezpośrednim użyciem CABasicAnimation.

Do debugowania i wizualizacji animacji UIKit używaj Xcode Debug View Hierarchy — pokazuje aktywne CAAnimations na każdej warstwie, ich czas trwania, krzywą i bieżący stan. Zrozumienie wewnętrznej struktury Core Animation pomaga uniknąć problemów z wydajnością przy złożonych animacjach i wybrać optymalne podejście między UIView.animate a bezpośrednim użyciem CABasicAnimation.

Często zadawane pytania

Jakie właściwości UIView można animować?

Animowalne właściwości UIView: frame, bounds, center, alpha, transform (CGAffineTransform), backgroundColor. Animowane są również zmiany layoutIfNeeded() przy zmianie constraintów Auto Layout. Pozostałe właściwości nie są animowane przez UIView.animate — do nich używaj CALayer lub CADisplayLink.

Czym różni się UIView.animate od UIView.animateKeyframes?

UIView.animate wykonuje jedną animację od bieżącego stanu do docelowego. UIView.animateKeyframes dzieli całkowity czas trwania na kilka kroków (keyframes) z różnymi względnymi startem i czasem trwania. Keyframe nadaje się do wieloetapowych sekwencji.

Dlaczego UIView.animate nie blokuje UI?

Animacje UIView.animate są przetwarzane w render server (backboardd) — osobnym procesie iOS. Główny wątek tylko wysyła początkowe i końcowe wartości właściwości. Interpolacja klatek jest wykonywana na GPU przez Core Animation z częstotliwością do 120 FPS.

Jak zatrzymać UIView.animate przed zakończeniem?

Wywołaj layer.removeAllAnimations() na UIView — usunie to wszystkie CAAnimations utworzone pod maską. Dla bardziej precyzyjnej kontroli użyj CATransaction i identyfikatorów animacji przez CAAnimation.keyPath.

Podsumowanie

  • UIView.animate — blokowa metoda animacji właściwości UIView z duration, delay, options i completion
  • Animacja sprężyny — usingSpringWithDamping + initialSpringVelocity dla fizycznego odbicia
  • Animacja keyframe — UIView.animateKeyframes z addKeyframe dla wieloetapowych sekwencji
  • Animowalne właściwości — frame, bounds, center, alpha, transform, backgroundColor
  • Core Animation — pod maską UIView.animate tworzy CABasicAnimation dla CALayer
  • Render server — animacje są przetwarzane z częstotliwością 120 Hz bez blokowania głównego wątku
  • SwiftUI — zalecane narzędzie dla nowych projektów, UIKit.animate — dla obsługi iOS 16-

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również