UIKit Dynamics ist ein Framework für physikalische Animationen in iOS (UIKit), das es Views ermöglicht, nach den Gesetzen der realen Physik zu interagieren: Schwerkraft, Kollisionen, Elastizität und Anziehungskräfte. Dieser Artikel erklärt die Komponenten von UIDynamicAnimator, die Arten von Verhaltensweisen (Behavior) und praktische Anwendungsszenarien.
Wichtige Punkte
UIKit Dynamics ist ein Physiksimulations-Framework, das von Apple in iOS 7 (2013) eingeführt wurde. Im Gegensatz zu UIView.animate (lineare Übergänge) und Core Animation (Ebenenanimation) simuliert UIKit Dynamics reale physikalische Interaktionen: Schwerkraft, Kollisionen, Kräfte, Elastizität und Reibung. Der Entwickler fügt UIDynamicAnimator Verhaltensweisen hinzu, und das System berechnet automatisch die Physik für jeden Frame.
Das Framework läuft mit 60/120 FPS und verwendet eine integrierte Physik-Engine basierend auf Starrkörpersimulation. UIKit Dynamics erfordert keine Kenntnisse in Physik oder Mathematik — wenden Sie einfach ein vorgefertigtes Verhalten an und konfigurieren Sie seine Parameter.
Laut Apple eignet sich UIKit Dynamics für UI-Effekte (Kartenstapel-Animation, Icon-Wackeln, Interface-Physik), ist aber nicht für Spiele gedacht — verwenden Sie für Spiele SceneKit oder SpriteKit.
UIDynamicAnimator ist die zentrale Klasse von UIKit Dynamics. Sie wird mit einer reference view (normalerweise die View des Controllers) initialisiert und verwaltet alle aktiven Verhaltensweisen. Jeden Frame berechnet UIDynamicAnimator die Positionen, Geschwindigkeiten und Beschleunigungen aller hinzugefügten Elemente nach physikalischen Gesetzen neu.
Die Methode addBehavior fügt ein Verhalten (oder ein komplexes UIDynamicBehavior) hinzu, removeBehavior entfernt es. Der Animator pausiert automatisch, wenn alle Objekte einen Ruhezustand erreichen (Fortsetzung ohne Kollisionen und Kräfte). Die Delegatmethode — UIDynamicAnimatorDelegate — benachrichtigt über Pause und Wiederaufnahme der Simulation.
Jedes Objekt, das an der Physik teilnimmt, muss das UIDynamicItem-Protokoll implementieren. UIView und UICollectionViewLayoutAttributes implementieren es bereits. Das Protokoll erfordert die Eigenschaften: bounds, center, transform. Wenn das Objekt benutzerdefiniert ist — implementieren Sie das Protokoll manuell.
UIKit Dynamics enthält sieben integrierte Verhaltenstypen, die jeweils einen bestimmten physikalischen Effekt modellieren. Verhaltensweisen können kombiniert werden: zum Beispiel erzeugen Schwerkraft + Kollisionen + Elastizität den Effekt fallender und abprallender Objekte.
| Behavior | Physikalischer Effekt | Wichtige Parameter |
|---|---|---|
| UIGravityBehavior | Schwerkraft (Kraftvektor) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Objekt- und Grenzkollisionen | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Verbindung (Feder/Seil) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Einrasten mit Dämpfung | snapPoint, damping (0-1) |
| UIPushBehavior | Schub/Impuls (kontinuierlich oder sofort) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Physikalische Objekteigenschaften | elasticity, friction, density, resistance |
| UIFieldBehavior | Kraftfelder (Wirbel, magnetisch, radial) | position, strength, falloff, region |
Für realistische Objektphysik werden mehrere Verhaltensweisen gleichzeitig benötigt. Zum Beispiel für eine fallende Karte: UIGravityBehavior (Schwerkraft), UICollisionBehavior (Kollision mit dem Boden), UIDynamicItemBehavior (Elastizität: 0,4 für Abprallen). Alle Verhaltensweisen werden zu einem UIDynamicAnimator hinzugefügt.
Swift-Code für UIKit Dynamics erstellt einen UIDynamicAnimator und fügt Verhaltensweisen hinzu. Das folgende Beispiel demonstriert Schwerkraft mit mehreren Objekten, Kollisionen und benutzerdefinierten physikalischen Eigenschaften.
import UIKit
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Animator mit reference view erstellen
animator = UIDynamicAnimator(referenceView: view)
// 2. Fallende Objekte erstellen
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. Schwerkraft
let gravity = UIGravityBehavior(items: [redView, blueView])
gravity.gravityDirection = CGVector(dx: 0, dy: 1)
gravity.magnitude = 0.8
animator.addBehavior(gravity)
// 4. Kollisionen
let collision = UICollisionBehavior(items: [redView, blueView])
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
// 5. Physikalische Eigenschaften
let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
itemBehavior.elasticity = 0.6
itemBehavior.friction = 0.3
itemBehavior.density = 1.0
animator.addBehavior(itemBehavior)
// 6. Snap-Verhalten bei Berührung
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
}
@objc
func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
// Snap-Verhalten für jedes 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 bei: (Punkt)")
}
}Das Beispiel erstellt zwei Views mit Schwerkraft, Kollisionen und physikalischen Eigenschaften. UISnapBehavior bei Berührung schnappt Objekte mit 0,5 Dämpfung zum Berührungspunkt. UICollisionBehaviorDelegate verfolgt den Beginn von Kollisionen für Ton- und visuelle Effekte.
UIKit Dynamics wird in iOS-Anwendungen für nicht-spielbezogene Interface-Physik verwendet. Beliebte Szenarien: Kartenstapel-Animation (UISnapBehavior zum Einrasten in die Mitte), Bildschirmwackeln bei Fehlern (UIDynamicItemBehavior + UIPushBehavior), „Sternschnuppen"-Effekt im Onboarding (gravity + collision + field behavior).
Für die Leistung empfiehlt UIKit Dynamics nicht mehr als 15-20 gleichzeitige Objekte mit Physik. Jedes Objekt erfordert Kollisions- und Kraftberechnungen pro Frame. Bei Überschreitung des Limits verwenden Sie CALayer statt UIView — Core Animation verarbeitet Ebenen effizienter.
Häufig gestellte Fragen
UIKit Dynamics modelliert physikalische Interaktionen (Schwerkraft, Kollisionen, Kräfte) basierend auf Starrkörpersimulation. Core Animation animiert CALayer-Eigenschaften (position, opacity, transform) entlang einer bestimmten Zeitkurve. Dynamics eignet sich für interaktive Physik, Core Animation für vordefinierte Übergänge.
Es gibt keine direkte Unterstützung für UIKit Dynamics in SwiftUI. Für physikalische Effekte verwenden Sie UIKitView + UIDynamicAnimator innerhalb von UIViewRepresentable oder benutzerdefinierte Animationen über Animation.spring() und withAnimation() in SwiftUI.
Rufen Sie animator.removeAllBehaviors() auf — dies entfernt alle aktiven physikalischen Verhaltensweisen. Der Animator pausiert automatisch, wenn alle Objekte Ruhe erreichen. Für eine temporäre Pause verwenden Sie die Eigenschaft animator.isPaused oder entfernen einzelne Verhaltensweisen.
Apple empfiehlt nicht mehr als 15-20 Objekte mit voller Physik (Schwerkraft + Kollisionen + Kräfte). Für Massenanimationen verwenden Sie UIFieldBehavior — es berechnet Kräfte zentral ohne paarweise Kollisionen, was die CPU-Last reduziert.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch