UIKit Dynamics — lényege, fizika kölcsönhatás iOS-ben

Szerző: IT Sectr Megjelenés: 2026-03-01 Olvasási idő: 8 perc

UIKit Dynamics — fizikai animációs keretrendszer iOS-ben (UIKit), amely lehetővé teszi a View-k számára, hogy a valós fizika törvényei szerint lépjenek kölcsönhatásba: gravitáció, ütközések, rugalmasság és vonzóerők. A cikk elmagyarázza az UIDynamicAnimator összetevőit, a viselkedések (behavior) típusait és a gyakorlati alkalmazási forgatókönyveket.

Főbb pontok

  • UIDynamicAnimator — a fizikai animáció motorja, amely összekapcsolja a viselkedéseket (behavior) és az objektumokat
  • UIGravityBehavior — gravitáció szimulációja irányvektorral és gyorsulás nagysággal
  • UICollisionBehavior — ütközések kezelése View-k és reference view határai között
  • UIDynamicItemBehavior — fizikai tulajdonságok beállítása: rugalmasság, sűrűség, súrlódás
  • UIAttachmentBehavior — kapcsolat két pont között rugó vagy kábel effektussal

Mi az a UIKit Dynamics?

UIKit Dynamics — fizikai modellező keretrendszer, amelyet az Apple az iOS 7-ben (2013) vezetett be. Ellentétben a UIView.animate-tel (lineáris átmenetek) és a Core Animation-nel (rétegek animációja), a UIKit Dynamics valós fizikai kölcsönhatásokat modellez: gravitációt, ütközéseket, erőket, rugalmasságot és súrlódást. A fejlesztő viselkedéseket (behaviors) ad hozzá az UIDynamicAnimator-hoz, és a rendszer automatikusan kiszámítja a fizikát minden egyes képkockához.

A keretrendszer 60/120 FPS-en működik, és beépített fizikai motort használ, amely merevtest-szimuláción (rigid body simulation) alapul. A UIKit Dynamics nem igényel fizikai vagy matematikai ismereteket — elég egy kész viselkedést alkalmazni és beállítani a paramétereket.

Az Apple szerint a UIKit Dynamics UI-effektusokhoz (kártyaköteg animáció, ikonok „remegése”, interfész fizikája) alkalmas, de játékokhoz nem — játékokhoz használja a SceneKit-et vagy a SpriteKit-et.

UIDynamicAnimator — a fizika motorja

UIDynamicAnimator — a UIKit Dynamics központi osztálya. Egy reference view-val (általában a vezérlő view-jával) inicializálódik, és kezeli az összes aktív viselkedést. Minden képkockában az UIDynamicAnimator újraszámolja az összes hozzáadott elem pozícióját, sebességét és gyorsulását a fizika törvényeinek megfelelően.

Az addBehavior metódus egy viselkedést (vagy összetett UIDynamicBehavior-öt) ad hozzá, a removeBehavior — eltávolítja. Az animátor automatikusan szünetel, amikor az összes objektum nyugalmi állapotba kerül (ütközések és erők nélkül). A delegate metódus — UIDynamicAnimatorDelegate — értesít a szimuláció szüneteléséről és folytatásáról.

UIDynamicItem — protokoll az animációhoz

Minden, a fizikában részt vevő objektumnak implementálnia kell a UIDynamicItem protokollt. Az UIView és az UICollectionViewLayoutAttributes már implementálja. A protokoll a következő tulajdonságokat követeli meg: bounds, center, transform. Ha az objektum egyedi — implementálja a protokollt manuálisan.

A Dynamic Behaviors típusai

UIKit Dynamics hét beépített viselkedéstípust tartalmaz, amelyek mindegyike egy meghatározott fizikai hatást modellez. A viselkedések kombinálhatók: például gravitáció + ütközések + rugalmasság eső és pattanó objektumok hatását kelti.

BehaviorFizikai hatásKulcsparaméterek
UIGravityBehaviorGravitáció (erővektor)gravityDirection (dx, dy), magnitude
UICollisionBehaviorObjektumok és határok ütközésecollisionMode, translucence, collisionDelegate
UIAttachmentBehaviorKapcsolat (rugó/kábel)anchorPoint, length, damping, frequency
UISnapBehaviorPontba húzás csillapítássalsnapPoint, damping (0-1)
UIPushBehaviorLökés/impulzus (folyamatos vagy azonnali)pushDirection, magnitude, mode
UIDynamicItemBehaviorObjektum fizikai tulajdonságaielasticity, friction, density, resistance
UIFieldBehaviorErőterek (örvény, mágnes, sugár)position, strength, falloff, region

Viselkedések kombinálása

Egy objektum valósághű fizikájához több viselkedésre van szükség egyszerre. Például egy eső kártyához: UIGravityBehavior (gravitációs erő), UICollisionBehavior (ütközés az aljával), UIDynamicItemBehavior (elasticity: 0.4 a pattanáshoz). Minden viselkedés egy UIDynamicAnimator-hoz adódik hozzá.

Swift kódpéldák

A Swift kód a UIKit Dynamics-hoz létrehoz egy UIDynamicAnimator-t és hozzáadja a viselkedéseket. Az alábbi példa gravitációt mutat be több objektummal, ütközésekkel és egyedi fizikai tulajdonságokkal.

swift
import UIKit

class PhysicsViewController: UIViewController {

    var animator: UIDynamicAnimator!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. Animátor létrehozása reference view-val
        animator = UIDynamicAnimator(referenceView: view)

        // 2. Eső objektumok létrehozása
        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. Gravitáció
        let gravity = UIGravityBehavior(items: [redView, blueView])
        gravity.gravityDirection = CGVector(dx: 0, dy: 1)
        gravity.magnitude = 0.8
        animator.addBehavior(gravity)

        // 4. Ütközések
        let collision = UICollisionBehavior(items: [redView, blueView])
        collision.translatesReferenceBoundsIntoBoundary = true
        collision.collisionDelegate = self
        animator.addBehavior(collision)

        // 5. Fizikai tulajdonságok
        let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
        itemBehavior.elasticity = 0.6
        itemBehavior.friction = 0.3
        itemBehavior.density = 1.0
        animator.addBehavior(itemBehavior)

        // 6. Snap viselkedés érintésre
        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        view.addGestureRecognizer(tap)
    }

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

        // Snap viselkedés minden objektumhoz
        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("Ütközés itt: (point)")
    }
}

A példa két View-t hoz létre gravitációval, ütközésekkel és fizikai tulajdonságokkal. Az UISnapBehavior érintéskor 0.5 csillapítással vonzza az objektumokat az érintés pontjához. Az UICollisionBehaviorDelegate nyomon követi az ütközések kezdetét hang- és vizuális effektusokhoz.

Gyakorlati alkalmazási forgatókönyvek

UIKit Dynamics-ot iOS-alkalmazásokban használják nem játék interfész fizikához. Népszerű forgatókönyvek: kártyaköteg animáció (UISnapBehavior a középponthoz vonzáshoz), képernyő rázása hiba esetén (UIDynamicItemBehavior + UIPushBehavior), „hulló csillagok” effektus az onboardingban (gravity + collision + field behavior).

A teljesítmény érdekében a UIKit Dynamics legfeljebb 15-20 egyidejű fizikai objektumot javasol. Minden objektum ütközési és erőszámításokat igényel minden képkockában. A határ túllépése esetén használjon CALayer-t UIView helyett — a Core Animation hatékonyabban dolgozza fel a rétegeket.

Gyakran Ismételt Kérdések

Miben különbözik a UIKit Dynamics a Core Animation-től?

UIKit Dynamics fizikai kölcsönhatásokat (gravitáció, ütközések, erők) modellez merevtest-szimuláció alapján. Core Animation — a CALayer tulajdonságainak (position, opacity, transform) animációja egy adott időgörbe szerint. A Dynamics interaktív fizikához alkalmas, a Core Animation — előre meghatározott átmenetekhez.

Használható a UIKit Dynamics SwiftUI-ban?

A UIKit Dynamics-nak nincs közvetlen támogatása a SwiftUI-ban. Fizikai effektusokhoz használjon UIKitView + UIDynamicAnimator-t UIViewRepresentable-en belül, vagy egyedi animációkat az Animation.spring() és withAnimation() segítségével a SwiftUI-ban.

Hogyan állítható le a UIKit Dynamics?

Hívja meg a animator.removeAllBehaviors() metódust — ez eltávolítja az összes aktív fizikai viselkedést. Az animátor automatikusan szünetel, amikor az összes objektum nyugalomba kerül. Ideiglenes szüneteltetéshez használja az animator.isPaused tulajdonságot, vagy távolítson el egyes viselkedéseket.

Hány objektum animálható egyszerre?

Az Apple legfeljebb 15-20 objektumot javasol teljes fizikával (gravitáció + ütközések + erők). Tömeges animációkhoz használja az UIFieldBehavior-t — ez központilag számítja ki az erőket páronkénti ütközések nélkül, csökkentve a CPU terhelését.

Összegzés

  • UIKit Dynamics — iOS fizikai animációs keretrendszer gravitáció, ütközések és erők szimulációjával
  • UIDynamicAnimator — motor, amely kezeli a viselkedéseket (behaviors) és minden képkockában kiszámítja a fizikát
  • 7 viselkedéstípus — UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior, UISnapBehavior, UIPushBehavior, UIDynamicItemBehavior, UIFieldBehavior
  • Kombinálás — gravity + collision + itemBehavior valósághű esési fizikát hoz létre pattanással
  • UIDynamicItem — protokoll a fizikában részt vevő objektumokhoz (az UIView alapértelmezés szerint implementálja)
  • Korlátozás — legfeljebb 20 objektum teljes fizikával, nem alkalmas játékokhoz és összetett jelenetekhez
  • SwiftUI — használjon UIViewRepresentable-t a UIKit Dynamics integrációjához

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is