UIKit Dynamics — фізика взаємодії в iOS

Автор: IT Sectr Опубліковано: 2026-03-01 Час читання: 8 хв

UIKit Dynamics — фреймворк фізичної анімації в iOS (UIKit), що дозволяє View взаємодіяти за законами реальної фізики: гравітація, зіткнення, пружність та сили притягання. Стаття пояснює компоненти UIDynamicAnimator, види поведінок (behavior) та практичні сценарії застосування.

Головне

  • UIDynamicAnimator — двигун фізичної анімації, що пов'язує поведінки (behavior) та об'єкти
  • UIGravityBehavior — симуляція гравітації з вектором напрямку та величиною прискорення
  • UICollisionBehavior — обробка зіткнень між View та межами reference view
  • UIDynamicItemBehavior — налаштування фізичних властивостей: еластичність, щільність, тертя
  • UIAttachmentBehavior — зв'язок між двома точками з ефектом пружини або троса

Що таке UIKit Dynamics?

UIKit Dynamics — фреймворк фізичного моделювання, представлений Apple в iOS 7 (2013). На відміну від UIView.animate (лінійні переходи) та Core Animation (анімація шарів), UIKit Dynamics моделює реальні фізичні взаємодії: гравітацію, зіткнення, сили, пружність та тертя. Розробник додає поведінки до UIDynamicAnimator, і система автоматично розраховує фізику для кожного кадру.

Фреймворк працює на частоті 60/120 FPS та використовує вбудований фізичний двигун на основі симуляції твердих тіл (rigid body simulation). UIKit Dynamics не вимагає знання фізики або математики — достатньо застосувати готову поведінку та налаштувати параметри.

За даними Apple, UIKit Dynamics підходить для UI-ефектів (анімація стопки карт, «тремтіння» іконок, фізика інтерфейсу), але не призначений для ігор — для ігор використовуйте SceneKit або SpriteKit.

UIDynamicAnimator — двигун фізики

UIDynamicAnimator — центральний клас UIKit Dynamics. Він ініціалізується з reference view (зазвичай view контролера) та керує всіма активними поведінками. Кожен кадр UIDynamicAnimator перераховує позиції, швидкості та прискорення всіх доданих елементів з урахуванням фізичних законів.

Метод addBehavior додає одну поведінку (або складний UIDynamicBehavior), removeBehavior — видаляє. Аніматор автоматично призупиняється, коли всі об'єкти досягають стану спокою (продовжують без зіткнень та сил). Метод делегата — UIDynamicAnimatorDelegate — сповіщає про паузу та відновлення симуляції.

UIDynamicItem — протокол для анімації

Будь-який об'єкт, що бере участь у фізиці, повинен реалізовувати протокол UIDynamicItem. UIView та UICollectionViewLayoutAttributes вже реалізують його. Протокол вимагає властивості: bounds, center, transform. Якщо об'єкт кастомний — реалізуйте протокол вручну.

Типи Dynamic Behaviors

UIKit Dynamics включає сім вбудованих типів поведінок, кожна з яких моделює певний фізичний ефект. Поведінки можна комбінувати: наприклад, гравітація + зіткнення + пружність створюють ефект падаючих та відскакуючих об'єктів.

BehaviorФізичний ефектКлючові параметри
UIGravityBehaviorГравітація (вектор сили)gravityDirection (dx, dy), magnitude
UICollisionBehaviorЗіткнення об'єктів та межcollisionMode, translucence, collisionDelegate
UIAttachmentBehaviorЗв'язок (пружина/трос)anchorPoint, length, damping, frequency
UISnapBehaviorПритягання до точки з демпфуваннямsnapPoint, damping (0-1)
UIPushBehaviorПоштовх/імпульс (безперервний або миттєвий)pushDirection, magnitude, mode
UIDynamicItemBehaviorФізичні властивості об'єктаelasticity, friction, density, resistance
UIFieldBehaviorСилові поля (вихор, магніт, радіус)position, strength, falloff, region

Комбінування поведінок

Для реалістичної фізики об'єкта потрібно кілька поведінок одночасно. Наприклад, для падаючої карти: UIGravityBehavior (сила тяжіння), UICollisionBehavior (зіткнення з дном), UIDynamicItemBehavior (elasticity: 0.4 для відскоку). Всі поведінки додаються до одного UIDynamicAnimator.

Приклади коду на Swift

Swift код для UIKit Dynamics створює UIDynamicAnimator та додає поведінки. Приклад нижче демонструє гравітацію з кількома об'єктами, зіткненнями та кастомними фізичними властивостями.

swift
import UIKit

class PhysicsViewController: UIViewController {

    var animator: UIDynamicAnimator!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. Створюємо аніматор з reference view
        animator = UIDynamicAnimator(referenceView: view)

        // 2. Створюємо падаючі об'єкти
        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. Гравітація
        let gravity = UIGravityBehavior(items: [redView, blueView])
        gravity.gravityDirection = CGVector(dx: 0, dy: 1)
        gravity.magnitude = 0.8
        animator.addBehavior(gravity)

        // 4. Зіткнення
        let collision = UICollisionBehavior(items: [redView, blueView])
        collision.translatesReferenceBoundsIntoBoundary = true
        collision.collisionDelegate = self
        animator.addBehavior(collision)

        // 5. Фізичні властивості
        let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
        itemBehavior.elasticity = 0.6
        itemBehavior.friction = 0.3
        itemBehavior.density = 1.0
        animator.addBehavior(itemBehavior)

        // 6. Snap-поведінка по тапу
        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        view.addGestureRecognizer(tap)
    }

    @objc
    func handleTap(_ gesture: UITapGestureRecognizer) {
        let point = gesture.location(in: view)

        // Snap-поведінка для кожного об'єкта
        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("Зіткнення в: (точка)")
    }
}

Приклад створює два View з гравітацією, зіткненнями та фізичними властивостями. UISnapBehavior при тапі притягує об'єкти до точки дотику з демпфуванням 0.5. UICollisionBehaviorDelegate відстежує початок зіткнень для звукових та візуальних ефектів.

Практичні сценарії застосування

UIKit Dynamics застосовується в iOS-додатках для неігрової фізики інтерфейсу. Популярні сценарії: анімація стопки карт (UISnapBehavior для притягання до центру), струшування екрана при помилці (UIDynamicItemBehavior + UIPushBehavior), ефект «падаючих зірок» в онбордингу (gravity + collision + field behavior).

Для продуктивності UIKit Dynamics рекомендує не більше 15-20 одночасних об'єктів з фізикою. Кожен об'єкт потребує розрахунку колізій та сил на кожному кадрі. При перевищенні ліміту використовуйте CALayer замість UIView — Core Animation обробляє шари ефективніше.

Часто задавані питання

Чим UIKit Dynamics відрізняється від Core Animation?

UIKit Dynamics моделює фізичні взаємодії (гравітація, зіткнення, сили) на основі симуляції твердих тіл. Core Animation — анімація властивостей CALayer (position, opacity, transform) за заданою часовою кривою. Dynamics підходить для інтерактивної фізики, Core Animation — для попередньо визначених переходів.

Чи можна використовувати UIKit Dynamics в SwiftUI?

Прямої підтримки UIKit Dynamics в SwiftUI немає. Для фізичних ефектів використовуйте UIKitView + UIDynamicAnimator всередині UIViewRepresentable, або кастомні анімації через Animation.spring() та withAnimation() в SwiftUI.

Як зупинити UIKit Dynamics?

Викличте animator.removeAllBehaviors() — це видалить всі активні фізичні поведінки. Аніматор автоматично призупиняється, коли всі об'єкти досягають спокою. Для тимчасової паузи використовуйте властивість animator.isPaused або видаліть окремі поведінки.

Скільки об'єктів можна анімувати одночасно?

Apple рекомендує не більше 15-20 об'єктів з повною фізикою (гравітація + зіткнення + сили). Для масових анімацій використовуйте UIFieldBehavior — він розраховує сили централізовано, без попарних колізій, що знижує навантаження на CPU.

Підсумки

  • UIKit Dynamics — фреймворк фізичної анімації iOS з симуляцією гравітації, зіткнень та сил
  • UIDynamicAnimator — двигун, що керує поведінками (behaviors) та розраховує фізику на кожному кадрі
  • 7 типів поведінок — UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior, UISnapBehavior, UIPushBehavior, UIDynamicItemBehavior, UIFieldBehavior
  • Комбінування — gravity + collision + itemBehavior створює реалістичну фізику падіння з відскоком
  • UIDynamicItem — протокол для об'єктів-учасників фізики (UIView реалізує за замовчуванням)
  • Обмеження — не більше 20 об'єктів з повною фізикою, не підходить для ігор та складних сцен
  • SwiftUI — використовуйте UIViewRepresentable для інтеграції UIKit Dynamics

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також