UIKit Dynamics — kärnan, fysik av interaktion i iOS

Författare: IT Sectr Publicerad: 2026-03-01 Lästid: 8 min

UIKit Dynamics — ramverk för fysisk animation i iOS (UIKit) som låter View interagera enligt verkliga fysikens lagar: gravitation, kollisioner, elasticitet och attraktionskrafter. Artikeln förklarar komponenterna i UIDynamicAnimator, typer av beteenden (behavior) och praktiska användningsscenarier.

Huvudpunkter

  • UIDynamicAnimator — motorn för fysisk animation som kopplar samman beteenden (behavior) och objekt
  • UIGravityBehavior — simulering av gravitation med riktningsvektor och accelerationsstorlek
  • UICollisionBehavior — hantering av kollisioner mellan View och gränser för reference view
  • UIDynamicItemBehavior — konfiguration av fysiska egenskaper: elasticitet, densitet, friktion
  • UIAttachmentBehavior — förbindelse mellan två punkter med fjäder- eller kabeleffekt

Vad är UIKit Dynamics?

UIKit Dynamics — ramverk för fysikalisk modellering som introducerades av Apple i iOS 7 (2013). Till skillnad från UIView.animate (linjära övergångar) och Core Animation (animering av lager) modellerar UIKit Dynamics verkliga fysiska interaktioner: gravitation, kollisioner, krafter, elasticitet och friktion. Utvecklaren lägger till beteenden (behaviors) till UIDynamicAnimator, och systemet beräknar automatiskt fysiken för varje bildruta.

Ramverket arbetar på 60/120 FPS och använder en inbyggd fysikmotor baserad på rigid body simulation. UIKit Dynamics kräver inga kunskaper i fysik eller matematik — det räcker att tillämpa ett färdigt beteende och konfigurera parametrarna.

Enligt Apple är UIKit Dynamics lämpligt för UI-effekter (animation av kortbunt, "skakning" av ikoner, gränssnittsfysik), men inte för spel — för spel använd SceneKit eller SpriteKit.

UIDynamicAnimator — fysikmotorn

UIDynamicAnimator — centralklassen i UIKit Dynamics. Den initieras med en reference view (vanligtvis kontrollerns view) och hanterar alla aktiva beteenden. Varje bildruta räknar UIDynamicAnimator om positioner, hastigheter och accelerationer för alla tillagda element enligt fysikens lagar.

Metoden addBehavior lägger till ett beteende (eller komplext UIDynamicBehavior), removeBehavior — tar bort det. Animatorn pausas automatiskt när alla objekt når vilotillstånd (utan kollisioner och krafter). Delegatmetoden — UIDynamicAnimatorDelegate — meddelar om paus och återupptagning av simuleringen.

UIDynamicItem — protokoll för animering

Varje objekt som deltar i fysiken måste implementera protokollet UIDynamicItem. UIView och UICollectionViewLayoutAttributes implementerar det redan. Protokollet kräver egenskaperna: bounds, center, transform. Om objektet är anpassat — implementera protokollet manuellt.

Typer av Dynamic Behaviors

UIKit Dynamics innehåller sju inbyggda typer av beteenden, som var och en modellerar en specifik fysisk effekt. Beteenden kan kombineras: till exempel skapar gravitation + kollisioner + elasticitet effekten av fallande och studsande objekt.

BehaviorFysisk effektNyckelparametrar
UIGravityBehaviorGravitation (kraftvektor)gravityDirection (dx, dy), magnitude
UICollisionBehaviorKollisioner av objekt och gränsercollisionMode, translucence, collisionDelegate
UIAttachmentBehaviorFörbindelse (fjäder/kabel)anchorPoint, length, damping, frequency
UISnapBehaviorDragning till punkt med dämpningsnapPoint, damping (0-1)
UIPushBehaviorTryck/impuls (kontinuerlig eller omedelbar)pushDirection, magnitude, mode
UIDynamicItemBehaviorFysiska egenskaper hos objektelasticity, friction, density, resistance
UIFieldBehaviorKraftfält (virvel, magnet, radie)position, strength, falloff, region

Kombinera beteenden

För realistisk fysik av ett objekt krävs flera beteenden samtidigt. Till exempel för ett fallande kort: UIGravityBehavior (gravitationskraft), UICollisionBehavior (kollision med botten), UIDynamicItemBehavior (elasticity: 0.4 för studs). Alla beteenden läggs till samma UIDynamicAnimator.

Kodexempel i Swift

Swift-kod för UIKit Dynamics skapar en UIDynamicAnimator och lägger till beteenden. Exemplet nedan visar gravitation med flera objekt, kollisioner och anpassade fysiska egenskaper.

swift
import UIKit

class PhysicsViewController: UIViewController {

    var animator: UIDynamicAnimator!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. Skapa animator med reference view
        animator = UIDynamicAnimator(referenceView: view)

        // 2. Skapa fallande 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. Gravitation
        let gravity = UIGravityBehavior(items: [redView, blueView])
        gravity.gravityDirection = CGVector(dx: 0, dy: 1)
        gravity.magnitude = 0.8
        animator.addBehavior(gravity)

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

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

        // 6. Snap-beteende vid beröring
        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        view.addGestureRecognizer(tap)
    }

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

        // Snap-beteende för varje 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("Kollision vid: (point)")
    }
}

Exemplet skapar två vyer med gravitation, kollisioner och fysiska egenskaper. UISnapBehavior vid beröring drar objekten till beröringspunkten med dämpning 0.5. UICollisionBehaviorDelegate spårar början av kollisioner för ljud- och visuella effekter.

Praktiska användningsscenarier

UIKit Dynamics används i iOS-applikationer för icke-spel gränssnittsfysik. Populära scenarier: animation av kortbunt (UISnapBehavior för dragning till mitten), skakning av skärmen vid fel (UIDynamicItemBehavior + UIPushBehavior), effekt av "fallande stjärnor" i onboarding (gravity + collision + field behavior).

För prestanda rekommenderar UIKit Dynamics inte mer än 15-20 samtidiga objekt med fysik. Varje objekt kräver beräkning av kollisioner och krafter i varje bildruta. Vid överskridande av gränsen, använd CALayer istället för UIView — Core Animation bearbetar lager mer effektivt.

Vanliga frågor

Vad skiljer UIKit Dynamics från Core Animation?

UIKit Dynamics modellerar fysiska interaktioner (gravitation, kollisioner, krafter) baserat på rigid body simulation. Core Animation — animering av CALayer-egenskaper (position, opacity, transform) enligt en given tidskurva. Dynamics lämpar sig för interaktiv fysik, Core Animation — för fördefinierade övergångar.

Kan UIKit Dynamics användas i SwiftUI?

Det finns inget direkt stöd för UIKit Dynamics i SwiftUI. För fysiska effekter, använd UIKitView + UIDynamicAnimator inuti UIViewRepresentable, eller anpassade animeringar via Animation.spring() och withAnimation() i SwiftUI.

Hur stoppar man UIKit Dynamics?

Anropa animator.removeAllBehaviors() — detta tar bort alla aktiva fysiska beteenden. Animatorn pausas automatiskt när alla objekt når vila. För tillfällig paus, använd egenskapen animator.isPaused eller ta bort enskilda beteenden.

Hur många objekt kan animeras samtidigt?

Apple rekommenderar inte mer än 15-20 objekt med full fysik (gravitation + kollisioner + krafter). För massanimeringar, använd UIFieldBehavior — den beräknar krafter centraliserat utan parvisa kollisioner, vilket minskar CPU-belastningen.

Sammanfattning

  • UIKit Dynamics — ramverk för fysisk animation i iOS med simulering av gravitation, kollisioner och krafter
  • UIDynamicAnimator — motor som hanterar beteenden (behaviors) och beräknar fysik i varje bildruta
  • 7 typer av beteenden — UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior, UISnapBehavior, UIPushBehavior, UIDynamicItemBehavior, UIFieldBehavior
  • Kombinering — gravity + collision + itemBehavior skapar realistisk fallfysik med studs
  • UIDynamicItem — protokoll för objekt som deltar i fysik (UIView implementerar som standard)
  • Begränsning — inte mer än 20 objekt med full fysik, inte lämpligt för spel och komplexa scener
  • SwiftUI — använd UIViewRepresentable för integration av UIKit Dynamics

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också