UIKit Dynamics — een framework voor fysieke animatie in iOS (UIKit) waarmee Views kunnen interageren volgens de wetten van de echte fysica: zwaartekracht, botsingen, elasticiteit en aantrekkingskrachten. Het artikel legt de componenten van UIDynamicAnimator, soorten gedragingen (behavior) en praktische toepassingsscenario's uit.
Belangrijkste
UIKit Dynamics — een framework voor fysieke modellering, geïntroduceerd door Apple in iOS 7 (2013). In tegenstelling tot UIView.animate (lineaire overgangen) en Core Animation (animatie van lagen), modelleert UIKit Dynamics echte fysieke interacties: zwaartekracht, botsingen, krachten, elasticiteit en wrijving. De ontwikkelaar voegt gedragingen (behaviors) toe aan UIDynamicAnimator, en het systeem berekent automatisch de fysica voor elk frame.
Het framework werkt op 60/120 FPS en gebruikt een ingebouwde fysicamotor gebaseerd op rigid body simulation. UIKit Dynamics vereist geen kennis van fysica of wiskunde — het is voldoende om een kant-en-klaar gedrag toe te passen en parameters in te stellen.
Volgens Apple is UIKit Dynamics geschikt voor UI-effecten (animatie van kaartenstapel, "trillen" van iconen, interfacenatuurkunde), maar niet bedoeld voor games — gebruik voor games SceneKit of SpriteKit.
UIDynamicAnimator — de centrale klasse van UIKit Dynamics. Het wordt geïnitialiseerd met een reference view (meestal de view van de controller) en beheert alle actieve gedragingen. Elk frame herberekent UIDynamicAnimator de posities, snelheden en versnellingen van alle toegevoegde elementen met inachtneming van de natuurwetten.
De methode addBehavior voegt één gedrag (of complex UIDynamicBehavior) toe, removeBehavior verwijdert het. De animator pauzeert automatisch wanneer alle objecten een rusttoestand bereiken (zonder botsingen en krachten). De delegate-methode — UIDynamicAnimatorDelegate — meldt pauze en hervatting van de simulatie.
Elk object dat deelneemt aan de fysica moet het protocol UIDynamicItem implementeren. UIView en UICollectionViewLayoutAttributes implementeren het al. Het protocol vereist eigenschappen: bounds, center, transform. Als het object aangepast is — implementeer het protocol handmatig.
UIKit Dynamics bevat zeven ingebouwde soorten gedragingen, die elk een specifiek fysiek effect modelleren. Gedragingen kunnen worden gecombineerd: bijvoorbeeld zwaartekracht + botsingen + elasticiteit creëren het effect van vallende en botsende objecten.
| Behavior | Fysiek effect | Belangrijkste parameters |
|---|---|---|
| UIGravityBehavior | Zwaartekracht (krachtvector) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Botsingen van objecten en grenzen | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Verbinding (veer/kabel) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Aantrekking naar punt met demping | snapPoint, damping (0-1) |
| UIPushBehavior | Duwen/impuls (continu of onmiddellijk) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Fysieke eigenschappen van object | elasticity, friction, density, resistance |
| UIFieldBehavior | Krachtvelden (wervel, magneet, straal) | position, strength, falloff, region |
Voor realistische fysica van een object zijn meerdere gedragingen tegelijk nodig. Bijvoorbeeld voor een vallende kaart: UIGravityBehavior (zwaartekracht), UICollisionBehavior (botsing met de bodem), UIDynamicItemBehavior (elasticity: 0.4 voor stuiteren). Alle gedragingen worden aan één UIDynamicAnimator toegevoegd.
Swift-code voor UIKit Dynamics maakt een UIDynamicAnimator en voegt gedragingen toe. Het onderstaande voorbeeld demonstreert zwaartekracht met meerdere objecten, botsingen en aangepaste fysieke eigenschappen.
import UIKit
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Animator met reference view maken
animator = UIDynamicAnimator(referenceView: view)
// 2. Vallende objecten maken
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. Zwaartekracht
let gravity = UIGravityBehavior(items: [redView, blueView])
gravity.gravityDirection = CGVector(dx: 0, dy: 1)
gravity.magnitude = 0.8
animator.addBehavior(gravity)
// 4. Botsingen
let collision = UICollisionBehavior(items: [redView, blueView])
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
// 5. Fysieke eigenschappen
let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
itemBehavior.elasticity = 0.6
itemBehavior.friction = 0.3
itemBehavior.density = 1.0
animator.addBehavior(itemBehavior)
// 6. Snap-gedrag bij aanraking
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
}
@objc
func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
// Snap-gedrag voor elk object
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("Botsing op: (point)")
}
}Het voorbeeld creëert twee Views met zwaartekracht, botsingen en fysieke eigenschappen. UISnapBehavior trekt bij aanraking objecten naar het aanraakpunt met een demping van 0.5. UICollisionBehaviorDelegate volgt het begin van botsingen voor geluids- en visuele effecten.
UIKit Dynamics wordt in iOS-applicaties toegepast voor niet-game interfacenatuurkunde. Populaire scenario's: animatie van kaartenstapel (UISnapBehavior voor aantrekking naar het midden), scherm schudden bij fout (UIDynamicItemBehavior + UIPushBehavior), effect van "vallende sterren" in onboarding (gravity + collision + field behavior).
Voor prestaties raadt UIKit Dynamics niet meer dan 15-20 gelijktijdige objecten met fysica aan. Elk object vereist berekening van botsingen en krachten in elk frame. Bij overschrijding van de limiet gebruik CALayer in plaats van UIView — Core Animation verwerkt lagen efficiënter.
Veelgestelde vragen
UIKit Dynamics modelleert fysieke interacties (zwaartekracht, botsingen, krachten) op basis van rigid body simulatie. Core Animation — animatie van CALayer-eigenschappen (position, opacity, transform) volgens een bepaalde tijdscurve. Dynamics is geschikt voor interactieve fysica, Core Animation — voor vooraf gedefinieerde overgangen.
Directe ondersteuning voor UIKit Dynamics in SwiftUI is er niet. Gebruik voor fysieke effecten UIKitView + UIDynamicAnimator binnen UIViewRepresentable, of aangepaste animaties via Animation.spring() en withAnimation() in SwiftUI.
Roep animator.removeAllBehaviors() aan — dit verwijdert alle actieve fysieke gedragingen. De animator pauzeert automatisch wanneer alle objecten rust bereiken. Gebruik voor tijdelijke pauze de eigenschap animator.isPaused of verwijder afzonderlijke gedragingen.
Apple raadt niet meer dan 15-20 objecten met volledige fysica (zwaartekracht + botsingen + krachten) aan. Gebruik voor massa-animaties UIFieldBehavior — dit berekent krachten gecentraliseerd zonder paarsgewijze botsingen, wat de CPU-belasting vermindert.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook