UIKit Dynamics — la physique de l'interaction dans iOS

Auteur : IT Sectr Publié le : 2026-03-01 Temps de lecture : 8 min

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

  • UIDynamicAnimator — le moteur d'animation physique qui relie les comportements et les objets
  • UIGravityBehavior — simulation de gravité avec vecteur de direction et magnitude d'accélération
  • UICollisionBehavior — gère les collisions entre les Views et les limites de la reference view
  • UIDynamicItemBehavior — configuration des propriétés physiques : élasticité, densité, friction
  • UIAttachmentBehavior — connexion entre deux points avec effet de ressort ou de câble

Qu'est-ce que UIKit Dynamics ?

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 — le moteur physique

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.

UIDynamicItem — protocole pour l'animation

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.

Types de Dynamic Behaviors

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.

BehaviorEffet physiqueParamètres clés
UIGravityBehaviorGravité (vecteur de force)gravityDirection (dx, dy), magnitude
UICollisionBehaviorCollisions d'objets et de limitescollisionMode, translucence, collisionDelegate
UIAttachmentBehaviorConnexion (ressort/câble)anchorPoint, length, damping, frequency
UISnapBehaviorAttraction vers un point avec amortissementsnapPoint, damping (0-1)
UIPushBehaviorPoussée/impulsion (continue ou instantanée)pushDirection, magnitude, mode
UIDynamicItemBehaviorPropriétés physiques de l'objetelasticity, friction, density, resistance
UIFieldBehaviorChamps de force (tourbillon, magnétique, radial)position, strength, falloff, region

Combinaison de comportements

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.

Exemples de code Swift

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.

swift
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.

Scénarios pratiques d'utilisation

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

En quoi UIKit Dynamics diffère-t-il de Core Animation ?

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.

Peut-on utiliser UIKit Dynamics dans SwiftUI ?

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.

Comment arrêter UIKit Dynamics ?

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.

Combien d'objets peuvent être animés simultanément ?

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é

  • UIKit Dynamics — framework d'animation physique iOS avec simulation de gravité, collisions et forces
  • UIDynamicAnimator — le moteur qui gère les comportements et calcule la physique à chaque image
  • 7 types de comportements — UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior, UISnapBehavior, UIPushBehavior, UIDynamicItemBehavior, UIFieldBehavior
  • Combinaison — gravity + collision + itemBehavior crée une physique de chute réaliste avec rebond
  • UIDynamicItem — protocole pour les objets participants à la physique (UIView implémente par défaut)
  • Limitation — pas plus de 20 objets avec physique complète, pas adapté aux jeux et scènes complexes
  • SwiftUI — utilisez UIViewRepresentable pour intégrer UIKit Dynamics

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.

Discuter du projet

Lisez aussi