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
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 — 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.
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.
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.
| Behavior | Efek Fisik | Parameter Kunci |
|---|---|---|
| UIGravityBehavior | Gravitasi (vektor gaya) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Tabrakan objek dan batas | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Hubungan (pegas/kabel) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Tarik ke titik dengan redaman | snapPoint, damping (0-1) |
| UIPushBehavior | Dorongan/impuls (kontinu atau instan) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Properti fisik objek | elasticity, friction, density, resistance |
| UIFieldBehavior | Medan gaya (pusaran, magnet, radius) | position, strength, falloff, region |
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.
Kode Swift untuk UIKit Dynamics membuat UIDynamicAnimator dan menambahkan perilaku. Contoh di bawah menunjukkan gravitasi dengan beberapa objek, tabrakan, dan properti fisik khusus.
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.
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
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.
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.
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.
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
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.
Baca juga