UIKit Dynamics — фрејмворк физичке анимације у iOS (UIKit), који омогућава View-овима да интерагују по законима реалне физике: гравитација, судари, еластичност и силе привлачења. Чланак објашњава компоненте UIDynamicAnimator, врсте понашања (behavior) и практичне сценарије примене.
Главно
UIKit Dynamics — фрејмворк физичког моделовања, представљен од Apple у iOS 7 (2013). За разлику од UIView.animate (линеарни прелази) и Core Animation (анимација слојева), UIKit Dynamics моделује реалне физичке интеракције: гравитацију, сударе, силе, еластичност и трење. Програмер додаје понашања (behaviors) у 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 — уклања. Animator се аутоматски паузира када сви објекти достигну стање мировања (без судара и сила). Делегат метод — 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("Судар на: (point)")
}
}Пример креира два 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 се аутоматски паузира када сви објекти достигну мировање. За привремену паузу користите својство animator.isPaused или уклоните појединачна понашања.
Apple препоручује не више од 15-20 објеката са пуном физиком (гравитација + судари + силе). За масовне анимације користите UIFieldBehavior — он израчунава силе централизовано, без парних судара, што смањује оптерећење CPU.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође