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
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 — 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.
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.
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.
| Behavior | Fysisk effekt | Nyckelparametrar |
|---|---|---|
| UIGravityBehavior | Gravitation (kraftvektor) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Kollisioner av objekt och gränser | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Förbindelse (fjäder/kabel) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Dragning till punkt med dämpning | snapPoint, damping (0-1) |
| UIPushBehavior | Tryck/impuls (kontinuerlig eller omedelbar) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Fysiska egenskaper hos objekt | elasticity, friction, density, resistance |
| UIFieldBehavior | Kraftfält (virvel, magnet, radie) | position, strength, falloff, region |
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.
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.
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.
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
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.
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.
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.
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
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.
Läs också