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 моделује реалне физичке интеракције: гравитацију, сударе, силе, еластичност и трење. Програмер додаје понашања (behaviors) у 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 — уклања. Animator се аутоматски паузира када сви објекти достигну стање мировања (без судара и сила). Делегат метод — 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("Судар на: (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?

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 се аутоматски паузира када сви објекти достигну мировање. За привремену паузу користите својство 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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође