UIKit Dynamics — фреймворк фізичної анімації в iOS (UIKit), що дозволяє View взаємодіяти за законами реальної фізики: гравітація, зіткнення, пружність та сили притягання. Стаття пояснює компоненти UIDynamicAnimator, види поведінок (behavior) та практичні сценарії застосування.
Головне
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 — центральний клас UIKit Dynamics. Він ініціалізується з reference view (зазвичай view контролера) та керує всіма активними поведінками. Кожен кадр UIDynamicAnimator перераховує позиції, швидкості та прискорення всіх доданих елементів з урахуванням фізичних законів.
Метод addBehavior додає одну поведінку (або складний UIDynamicBehavior), removeBehavior — видаляє. Аніматор автоматично призупиняється, коли всі об'єкти досягають стану спокою (продовжують без зіткнень та сил). Метод делегата — UIDynamicAnimatorDelegate — сповіщає про паузу та відновлення симуляції.
Будь-який об'єкт, що бере участь у фізиці, повинен реалізовувати протокол UIDynamicItem. UIView та UICollectionViewLayoutAttributes вже реалізують його. Протокол вимагає властивості: bounds, center, transform. Якщо об'єкт кастомний — реалізуйте протокол вручну.
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 код для UIKit Dynamics створює UIDynamicAnimator та додає поведінки. Приклад нижче демонструє гравітацію з кількома об'єктами, зіткненнями та кастомними фізичними властивостями.
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 — анімація властивостей CALayer (position, opacity, transform) за заданою часовою кривою. Dynamics підходить для інтерактивної фізики, Core Animation — для попередньо визначених переходів.
Прямої підтримки UIKit Dynamics в SwiftUI немає. Для фізичних ефектів використовуйте UIKitView + UIDynamicAnimator всередині UIViewRepresentable, або кастомні анімації через Animation.spring() та withAnimation() в SwiftUI.
Викличте animator.removeAllBehaviors() — це видалить всі активні фізичні поведінки. Аніматор автоматично призупиняється, коли всі об'єкти досягають спокою. Для тимчасової паузи використовуйте властивість animator.isPaused або видаліть окремі поведінки.
Apple рекомендує не більше 15-20 об'єктів з повною фізикою (гравітація + зіткнення + сили). Для масових анімацій використовуйте UIFieldBehavior — він розраховує сили централізовано, без попарних колізій, що знижує навантаження на CPU.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також