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
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 — 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.
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ě.
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ů.
| Behavior | Fyzikální efekt | Klíčové parametry |
|---|---|---|
| UIGravityBehavior | Gravitace (vektor síly) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Srážky objektů a hranic | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Spojení (pružina/lano) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Přitahování k bodu s tlumením | snapPoint, damping (0-1) |
| UIPushBehavior | Zatlačení/impulz (kontinuální nebo okamžitý) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Fyzické vlastnosti objektu | elasticity, friction, density, resistance |
| UIFieldBehavior | Silová pole (vír, magnet, poloměr) | position, strength, falloff, region |
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.
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.
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.
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
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.
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.
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í.
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í
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í.
Přečtěte si také