UIKit Dynamics est un framework d'animation physique dans iOS (UIKit) qui permet aux Views d'interagir selon les lois de la physique réelle : gravité, collisions, élasticité et forces d'attraction. Cet article explique les composants d'UIDynamicAnimator, les types de comportements (behavior) et les scénarios pratiques d'utilisation.
Points clés
UIKit Dynamics est un framework de simulation physique introduit par Apple dans iOS 7 (2013). Contrairement à UIView.animate (transitions linéaires) et Core Animation (animation de couches), UIKit Dynamics simule des interactions physiques réelles : gravité, collisions, forces, élasticité et friction. Le développeur ajoute des comportements à UIDynamicAnimator et le système calcule automatiquement la physique pour chaque image.
Le framework fonctionne à 60/120 FPS et utilise un moteur physique intégré basé sur la simulation de corps rigides. UIKit Dynamics ne nécessite pas de connaissances en physique ou en mathématiques — il suffit d'appliquer un comportement prêt à l'emploi et de configurer ses paramètres.
Selon Apple, UIKit Dynamics convient aux effets d'interface utilisateur (animation de pile de cartes, vibration d'icônes, physique d'interface), mais n'est pas destiné aux jeux — utilisez SceneKit ou SpriteKit pour les jeux.
UIDynamicAnimator est la classe centrale d'UIKit Dynamics. Il est initialisé avec une reference view (généralement la vue du contrôleur) et gère tous les comportements actifs. Chaque image, UIDynamicAnimator recalcule les positions, vitesses et accélérations de tous les éléments ajoutés selon les lois physiques.
La méthode addBehavior ajoute un comportement (ou un UIDynamicBehavior complexe), removeBehavior le supprime. L'animateur se met automatiquement en pause lorsque tous les objets atteignent un état de repos (continuent sans collisions ni forces). La méthode déléguée — UIDynamicAnimatorDelegate — notifie la pause et la reprise de la simulation.
Tout objet participant à la physique doit implémenter le protocole UIDynamicItem. UIView et UICollectionViewLayoutAttributes l'implémentent déjà. Le protocole nécessite les propriétés : bounds, center, transform. Si l'objet est personnalisé — implémentez le protocole manuellement.
UIKit Dynamics comprend sept types de comportements intégrés, chacun modélisant un effet physique spécifique. Les comportements peuvent être combinés : par exemple, gravité + collisions + élasticité créent l'effet d'objets tombant et rebondissant.
| Behavior | Effet physique | Paramètres clés |
|---|---|---|
| UIGravityBehavior | Gravité (vecteur de force) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Collisions d'objets et de limites | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Connexion (ressort/câble) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Attraction vers un point avec amortissement | snapPoint, damping (0-1) |
| UIPushBehavior | Poussée/impulsion (continue ou instantanée) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Propriétés physiques de l'objet | elasticity, friction, density, resistance |
| UIFieldBehavior | Champs de force (tourbillon, magnétique, radial) | position, strength, falloff, region |
Pour une physique réaliste d'objets, plusieurs comportements sont nécessaires simultanément. Par exemple, pour une carte qui tombe : UIGravityBehavior (force de gravité), UICollisionBehavior (collision avec le fond), UIDynamicItemBehavior (élasticité : 0,4 pour le rebond). Tous les comportements sont ajoutés à un seul UIDynamicAnimator.
Le code Swift pour UIKit Dynamics crée un UIDynamicAnimator et ajoute des comportements. L'exemple ci-dessous illustre la gravité avec plusieurs objets, des collisions et des propriétés physiques personnalisées.
import UIKit
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Créer l'animateur avec la reference view
animator = UIDynamicAnimator(referenceView: view)
// 2. Créer les objets en chute
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é
let gravity = UIGravityBehavior(items: [redView, blueView])
gravity.gravityDirection = CGVector(dx: 0, dy: 1)
gravity.magnitude = 0.8
animator.addBehavior(gravity)
// 4. Collisions
let collision = UICollisionBehavior(items: [redView, blueView])
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
// 5. Propriétés physiques
let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
itemBehavior.elasticity = 0.6
itemBehavior.friction = 0.3
itemBehavior.density = 1.0
animator.addBehavior(itemBehavior)
// 6. Comportement Snap au toucher
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
}
@objc
func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
// Comportement Snap pour chaque objet
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("Collision à : (point)")
}
}L'exemple crée deux Views avec gravité, collisions et propriétés physiques. UISnapBehavior au toucher attire les objets vers le point tactile avec un amortissement de 0,5. UICollisionBehaviorDelegate suit le début des collisions pour des effets sonores et visuels.
UIKit Dynamics est utilisé dans les applications iOS pour la physique d'interface non ludique. Scénarios populaires : animation de pile de cartes (UISnapBehavior pour l'attraction au centre), secouement d'écran en cas d'erreur (UIDynamicItemBehavior + UIPushBehavior), effet d'« étoiles filantes » dans l'onboarding (gravity + collision + field behavior).
Pour les performances, UIKit Dynamics recommande de ne pas dépasser 15 à 20 objets simultanés avec physique. Chaque objet nécessite des calculs de collision et de force à chaque image. En cas de dépassement de la limite, utilisez CALayer au lieu de UIView — Core Animation traite les couches plus efficacement.
Questions fréquentes
UIKit Dynamics modélise les interactions physiques (gravité, collisions, forces) basées sur la simulation de corps rigides. Core Animation anime les propriétés de CALayer (position, opacity, transform) le long d'une courbe temporelle spécifiée. Dynamics convient à la physique interactive, Core Animation aux transitions prédéfinies.
Il n'y a pas de support direct pour UIKit Dynamics dans SwiftUI. Pour les effets physiques, utilisez UIKitView + UIDynamicAnimator dans UIViewRepresentable, ou des animations personnalisées via Animation.spring() et withAnimation() dans SwiftUI.
Appelez animator.removeAllBehaviors() — cela supprime tous les comportements physiques actifs. L'animateur se met automatiquement en pause lorsque tous les objets atteignent le repos. Pour une pause temporaire, utilisez la propriété animator.isPaused ou supprimez des comportements individuels.
Apple recommande de ne pas dépasser 15 à 20 objets avec physique complète (gravité + collisions + forces). Pour les animations de masse, utilisez UIFieldBehavior — il calcule les forces centralement, sans collisions par paires, ce qui réduit la charge du CPU.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi