UIKit Dynamics — esensi, fisika interaksi di iOS

Penulis: IT Sectr Diterbitkan: 2026-03-01 Waktu membaca: 8 mnt

UIKit Dynamics — framework animasi fisik di iOS (UIKit) yang memungkinkan View berinteraksi sesuai hukum fisika nyata: gravitasi, tabrakan, elastisitas, dan gaya tarik. Artikel ini menjelaskan komponen UIDynamicAnimator, jenis perilaku (behavior), dan skenario penerapan praktis.

Utama

  • UIDynamicAnimator — mesin animasi fisik yang menghubungkan perilaku (behavior) dan objek
  • UIGravityBehavior — simulasi gravitasi dengan vektor arah dan besaran percepatan
  • UICollisionBehavior — penanganan tabrakan antar View dan batas reference view
  • UIDynamicItemBehavior — konfigurasi properti fisik: elastisitas, densitas, gesekan
  • UIAttachmentBehavior — hubungan antara dua titik dengan efek pegas atau kabel

Apa itu UIKit Dynamics?

UIKit Dynamics — framework pemodelan fisik yang diperkenalkan oleh Apple di iOS 7 (2013). Berbeda dengan UIView.animate (transisi linear) dan Core Animation (animasi layer), UIKit Dynamics memodelkan interaksi fisik nyata: gravitasi, tabrakan, gaya, elastisitas, dan gesekan. Pengembang menambahkan perilaku (behaviors) ke UIDynamicAnimator, dan sistem secara otomatis menghitung fisika untuk setiap frame.

Framework ini bekerja pada 60/120 FPS dan menggunakan mesin fisik bawaan berdasarkan simulasi benda tegar (rigid body simulation). UIKit Dynamics tidak memerlukan pengetahuan fisika atau matematika — cukup terapkan perilaku yang sudah jadi dan atur parameter.

Menurut Apple, UIKit Dynamics cocok untuk efek UI (animasi tumpukan kartu, "getaran" ikon, fisika antarmuka), tetapi tidak ditujukan untuk game — untuk game gunakan SceneKit atau SpriteKit.

UIDynamicAnimator — mesin fisika

UIDynamicAnimator — kelas sentral UIKit Dynamics. Diinisialisasi dengan reference view (biasanya view controller) dan mengelola semua perilaku aktif. Setiap frame, UIDynamicAnimator menghitung ulang posisi, kecepatan, dan percepatan semua elemen yang ditambahkan sesuai dengan hukum fisika.

Metode addBehavior menambahkan satu perilaku (atau UIDynamicBehavior kompleks), removeBehavior — menghapusnya. Animator secara otomatis berhenti ketika semua objek mencapai keadaan diam (tanpa tabrakan dan gaya). Metode delegate — UIDynamicAnimatorDelegate — memberitahu tentang jeda dan kelanjutan simulasi.

UIDynamicItem — protokol untuk animasi

Setiap objek yang berpartisipasi dalam fisika harus mengimplementasikan protokol UIDynamicItem. UIView dan UICollectionViewLayoutAttributes sudah mengimplementasikannya. Protokol memerlukan properti: bounds, center, transform. Jika objek khusus — implementasikan protokol secara manual.

Jenis Dynamic Behaviors

UIKit Dynamics mencakup tujuh jenis perilaku bawaan, yang masing-masing memodelkan efek fisik tertentu. Perilaku dapat dikombinasikan: misalnya, gravitasi + tabrakan + elastisitas menciptakan efek objek jatuh dan memantul.

BehaviorEfek FisikParameter Kunci
UIGravityBehaviorGravitasi (vektor gaya)gravityDirection (dx, dy), magnitude
UICollisionBehaviorTabrakan objek dan batascollisionMode, translucence, collisionDelegate
UIAttachmentBehaviorHubungan (pegas/kabel)anchorPoint, length, damping, frequency
UISnapBehaviorTarik ke titik dengan redamansnapPoint, damping (0-1)
UIPushBehaviorDorongan/impuls (kontinu atau instan)pushDirection, magnitude, mode
UIDynamicItemBehaviorProperti fisik objekelasticity, friction, density, resistance
UIFieldBehaviorMedan gaya (pusaran, magnet, radius)position, strength, falloff, region

Menggabungkan perilaku

Untuk fisika realistis suatu objek diperlukan beberapa perilaku secara bersamaan. Misalnya, untuk kartu yang jatuh: UIGravityBehavior (gaya gravitasi), UICollisionBehavior (tabrakan dengan dasar), UIDynamicItemBehavior (elasticity: 0.4 untuk pantulan). Semua perilaku ditambahkan ke satu UIDynamicAnimator.

Contoh Kode di Swift

Kode Swift untuk UIKit Dynamics membuat UIDynamicAnimator dan menambahkan perilaku. Contoh di bawah menunjukkan gravitasi dengan beberapa objek, tabrakan, dan properti fisik khusus.

swift
import UIKit

class PhysicsViewController: UIViewController {

    var animator: UIDynamicAnimator!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. Membuat animator dengan reference view
        animator = UIDynamicAnimator(referenceView: view)

        // 2. Membuat objek jatuh
        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. Gravitasi
        let gravity = UIGravityBehavior(items: [redView, blueView])
        gravity.gravityDirection = CGVector(dx: 0, dy: 1)
        gravity.magnitude = 0.8
        animator.addBehavior(gravity)

        // 4. Tabrakan
        let collision = UICollisionBehavior(items: [redView, blueView])
        collision.translatesReferenceBoundsIntoBoundary = true
        collision.collisionDelegate = self
        animator.addBehavior(collision)

        // 5. Properti fisik
        let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
        itemBehavior.elasticity = 0.6
        itemBehavior.friction = 0.3
        itemBehavior.density = 1.0
        animator.addBehavior(itemBehavior)

        // 6. Perilaku Snap saat sentuhan
        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        view.addGestureRecognizer(tap)
    }

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

        // Perilaku Snap untuk setiap objek
        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("Tabrakan di: (point)")
    }
}

Contoh membuat dua View dengan gravitasi, tabrakan, dan properti fisik. UISnapBehavior saat sentuhan menarik objek ke titik sentuhan dengan redaman 0.5. UICollisionBehaviorDelegate melacak awal tabrakan untuk efek suara dan visual.

Skenario Penerapan Praktis

UIKit Dynamics diterapkan di aplikasi iOS untuk fisika antarmuka non-game. Skenario populer: animasi tumpukan kartu (UISnapBehavior untuk tarikan ke tengah), goyangan layar saat error (UIDynamicItemBehavior + UIPushBehavior), efek "bintang jatuh" di onboarding (gravity + collision + field behavior).

Untuk kinerja, UIKit Dynamics merekomendasikan tidak lebih dari 15-20 objek simultan dengan fisika. Setiap objek memerlukan perhitungan tabrakan dan gaya di setiap frame. Saat melebihi batas, gunakan CALayer daripada UIView — Core Animation memproses layer lebih efisien.

Pertanyaan yang Sering Diajukan

Apa perbedaan UIKit Dynamics dengan Core Animation?

UIKit Dynamics memodelkan interaksi fisik (gravitasi, tabrakan, gaya) berdasarkan simulasi benda tegar. Core Animation — animasi properti CALayer (position, opacity, transform) berdasarkan kurva waktu tertentu. Dynamics cocok untuk fisika interaktif, Core Animation — untuk transisi yang telah ditentukan.

Bisakah UIKit Dynamics digunakan di SwiftUI?

Dukungan langsung untuk UIKit Dynamics di SwiftUI tidak ada. Untuk efek fisik, gunakan UIKitView + UIDynamicAnimator di dalam UIViewRepresentable, atau animasi khusus melalui Animation.spring() dan withAnimation() di SwiftUI.

Bagaimana cara menghentikan UIKit Dynamics?

Panggil animator.removeAllBehaviors() — ini akan menghapus semua perilaku fisik aktif. Animator secara otomatis berhenti saat semua objek mencapai keadaan diam. Untuk jeda sementara, gunakan properti animator.isPaused atau hapus perilaku individual.

Berapa banyak objek yang dapat dianimasikan secara bersamaan?

Apple merekomendasikan tidak lebih dari 15-20 objek dengan fisika penuh (gravitasi + tabrakan + gaya). Untuk animasi massal, gunakan UIFieldBehavior — ia menghitung gaya secara terpusat tanpa tabrakan berpasangan, mengurangi beban CPU.

Kesimpulan

  • UIKit Dynamics — framework animasi fisik iOS dengan simulasi gravitasi, tabrakan, dan gaya
  • UIDynamicAnimator — mesin yang mengelola perilaku (behaviors) dan menghitung fisika di setiap frame
  • 7 jenis perilaku — UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior, UISnapBehavior, UIPushBehavior, UIDynamicItemBehavior, UIFieldBehavior
  • Kombinasi — gravity + collision + itemBehavior menciptakan fisika jatuh realistis dengan pantulan
  • UIDynamicItem — protokol untuk objek peserta fisika (UIView mengimplementasikan secara default)
  • Keterbatasan — tidak lebih dari 20 objek dengan fisika penuh, tidak cocok untuk game dan adegan kompleks
  • SwiftUI — gunakan UIViewRepresentable untuk integrasi UIKit Dynamics

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga