UIKit Dynamics — podstata, fyzika interakce v iOS

Autor: IT Sectr Publikováno: 2026-03-01 Doba čtení: 8 min

UIKit Dynamics — framework fyzické animace v iOS (UIKit), který umožňuje View interagovat podle zákonů reálné fyziky: gravitace, srážky, pružnost a přitažlivé síly. Článek vysvětluje komponenty UIDynamicAnimator, typy chování (behavior) a praktické scénáře použití.

Hlavní body

  • UIDynamicAnimator — motor fyzické animace, spojující chování (behavior) a objekty
  • UIGravityBehavior — simulace gravitace s vektorem směru a velikostí zrychlení
  • UICollisionBehavior — zpracování srážek mezi View a hranicemi reference view
  • UIDynamicItemBehavior — nastavení fyzických vlastností: pružnost, hustota, tření
  • UIAttachmentBehavior — spojení mezi dvěma body s efektem pružiny nebo lana

Co je UIKit Dynamics?

UIKit Dynamics — framework fyzikálního modelování, představený Apple v iOS 7 (2013). Na rozdíl od UIView.animate (lineární přechody) a Core Animation (animace vrstev), UIKit Dynamics modeluje reálné fyzické interakce: gravitaci, srážky, síly, pružnost a tření. Vývojář přidává chování (behaviors) do UIDynamicAnimator a systém automaticky vypočítává fyziku pro každý snímek.

Framework pracuje na 60/120 FPS a používá vestavěný fyzikální motor založený na simulaci tuhých těles (rigid body simulation). UIKit Dynamics nevyžaduje znalost fyziky ani matematiky — stačí použít hotové chování a nastavit parametry.

Podle Apple je UIKit Dynamics vhodný pro UI efekty (animace hromádky karet, „chvění“ ikon, fyzika rozhraní), ale není určen pro hry — pro hry používejte SceneKit nebo SpriteKit.

UIDynamicAnimator — motor fyziky

UIDynamicAnimator — centrální třída UIKit Dynamics. Inicializuje se s reference view (obvykle view ovladače) a spravuje všechna aktivní chování. Každý snímek UIDynamicAnimator přepočítává pozice, rychlosti a zrychlení všech přidaných prvků s ohledem na fyzikální zákony.

Metoda addBehavior přidává jedno chování (nebo komplexní UIDynamicBehavior), removeBehavior — odebírá. Animátor se automaticky pozastaví, když všechny objekty dosáhnou klidového stavu (bez srážek a sil). Delegátní metoda — UIDynamicAnimatorDelegate — informuje o pozastavení a obnovení simulace.

UIDynamicItem — protokol pro animaci

Každý objekt účastnící se fyziky musí implementovat protokol UIDynamicItem. UIView a UICollectionViewLayoutAttributes jej již implementují. Protokol vyžaduje vlastnosti: bounds, center, transform. Pokud je objekt vlastní — implementujte protokol ručně.

Typy Dynamic Behaviors

UIKit Dynamics obsahuje sedm vestavěných typů chování, z nichž každé modeluje specifický fyzikální efekt. Chování lze kombinovat: například gravitace + srážky + pružnost vytvářejí efekt padajících a odrážejících se objektů.

BehaviorFyzikální efektKlíčové parametry
UIGravityBehaviorGravitace (vektor síly)gravityDirection (dx, dy), magnitude
UICollisionBehaviorSrážky objektů a hraniccollisionMode, translucence, collisionDelegate
UIAttachmentBehaviorSpojení (pružina/lano)anchorPoint, length, damping, frequency
UISnapBehaviorPřitahování k bodu s tlumenímsnapPoint, damping (0-1)
UIPushBehaviorZatlačení/impulz (kontinuální nebo okamžitý)pushDirection, magnitude, mode
UIDynamicItemBehaviorFyzické vlastnosti objektuelasticity, friction, density, resistance
UIFieldBehaviorSilová pole (vír, magnet, poloměr)position, strength, falloff, region

Kombinování chování

Pro realistickou fyziku objektu je potřeba několik chování současně. Například pro padající kartu: UIGravityBehavior (gravitační síla), UICollisionBehavior (srážka se dnem), UIDynamicItemBehavior (elasticity: 0.4 pro odraz). Všechna chování se přidávají do jednoho UIDynamicAnimator.

Příklady kódu ve Swift

Swift kód pro UIKit Dynamics vytváří UIDynamicAnimator a přidává chování. Níže uvedený příklad demonstruje gravitaci s více objekty, srážkami a vlastními fyzickými vlastnostmi.

swift
import UIKit

class PhysicsViewController: UIViewController {

    var animator: UIDynamicAnimator!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. Vytvoření animátoru s reference view
        animator = UIDynamicAnimator(referenceView: view)

        // 2. Vytvoření padajících objektů
        let redView = UIView(frame: CGRect(x: 100, y: 50, width: 60, height: 60))
        redView.backgroundColor = .systemRed
        redView.layer.cornerRadius = 8
        view.addSubview(redView)

        let blueView = UIView(frame: CGRect(x: 200, y: 30, width: 60, height: 60))
        blueView.backgroundColor = .systemBlue
        blueView.layer.cornerRadius = 8
        view.addSubview(blueView)

        // 3. Gravitace
        let gravity = UIGravityBehavior(items: [redView, blueView])
        gravity.gravityDirection = CGVector(dx: 0, dy: 1)
        gravity.magnitude = 0.8
        animator.addBehavior(gravity)

        // 4. Srážky
        let collision = UICollisionBehavior(items: [redView, blueView])
        collision.translatesReferenceBoundsIntoBoundary = true
        collision.collisionDelegate = self
        animator.addBehavior(collision)

        // 5. Fyzické vlastnosti
        let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
        itemBehavior.elasticity = 0.6
        itemBehavior.friction = 0.3
        itemBehavior.density = 1.0
        animator.addBehavior(itemBehavior)

        // 6. Snap chování při dotyku
        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        view.addGestureRecognizer(tap)
    }

    @objc
    func handleTap(_ gesture: UITapGestureRecognizer) {
        let point = gesture.location(in: view)

        // Snap chování pro každý objekt
        for subview in view.subviews where subview is UIView {
            animator.removeAllBehaviors()
            let snap = UISnapBehavior(item: subview, snapTo: point)
            snap.damping = 0.5
            animator.addBehavior(snap)
        }
    }
}

extension PhysicsViewController: UICollisionBehaviorDelegate {
    func collisionBehavior(_ behavior: UICollisionBehavior,
                             beganContactFor item1: UIDynamicItem,
                             with item2: UIDynamicItem,
                             at point: CGPoint) {
        print("Srážka v: (point)")
    }
}

Příklad vytváří dva View s gravitací, srážkami a fyzickými vlastnostmi. UISnapBehavior při dotyku přitahuje objekty k bodu dotyku s tlumením 0.5. UICollisionBehaviorDelegate sleduje začátek srážek pro zvukové a vizuální efekty.

Praktické scénáře použití

UIKit Dynamics se používá v iOS aplikacích pro neherní fyziku rozhraní. Populární scénáře: animace hromádky karet (UISnapBehavior pro přitahování do středu), třesení obrazovky při chybě (UIDynamicItemBehavior + UIPushBehavior), efekt „padajících hvězd“ v onboardingu (gravity + collision + field behavior).

Pro výkon UIKit Dynamics doporučuje ne více než 15-20 současných objektů s fyzikou. Každý objekt vyžaduje výpočet srážek a sil v každém snímku. Při překročení limitu použijte CALayer místo UIView — Core Animation zpracovává vrstvy efektivněji.

Často kladené otázky

Čím se UIKit Dynamics liší od Core Animation?

UIKit Dynamics modeluje fyzické interakce (gravitace, srážky, síly) na základě simulace tuhých těles. Core Animation — animace vlastností CALayer (position, opacity, transform) podle dané časové křivky. Dynamics je vhodný pro interaktivní fyziku, Core Animation — pro předdefinované přechody.

Lze použít UIKit Dynamics ve SwiftUI?

Přímá podpora UIKit Dynamics ve SwiftUI neexistuje. Pro fyzické efekty použijte UIKitView + UIDynamicAnimator uvnitř UIViewRepresentable, nebo vlastní animace přes Animation.spring() a withAnimation() ve SwiftUI.

Jak zastavit UIKit Dynamics?

Zavolejte animator.removeAllBehaviors() — to odstraní všechna aktivní fyzická chování. Animátor se automaticky pozastaví, když všechny objekty dosáhnou klidu. Pro dočasnou pauzu použijte vlastnost animator.isPaused nebo odeberte jednotlivá chování.

Kolik objektů lze animovat současně?

Apple doporučuje ne více než 15-20 objektů s plnou fyzikou (gravitace + srážky + síly). Pro hromadné animace použijte UIFieldBehavior — počítá síly centrálně bez párových srážek, což snižuje zatížení CPU.

Shrnutí

  • UIKit Dynamics — framework fyzické animace iOS s simulací gravitace, srážek a sil
  • UIDynamicAnimator — motor spravující chování (behaviors) a počítající fyziku v každém snímku
  • 7 typů chování — UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior, UISnapBehavior, UIPushBehavior, UIDynamicItemBehavior, UIFieldBehavior
  • Kombinování — gravity + collision + itemBehavior vytváří realistickou fyziku pádu s odrazem
  • UIDynamicItem — protokol pro objekty účastnící se fyziky (UIView implementuje výchozí)
  • Omezení — ne více než 20 objektů s plnou fyzikou, není vhodné pro hry a složité scény
  • SwiftUI — použijte UIViewRepresentable pro integraci UIKit Dynamics

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také