UIKit Dynamics, iOS'ta (UIKit) View'lerin gerçek fizik yasalarına göre etkileşime girmesini sağlayan fiziksel animasyon framework'üdür: yerçekimi, çarpışmalar, esneklik ve çekim kuvvetleri. Bu makale UIDynamicAnimator bileşenlerini, davranış (behavior) türlerini ve pratik kullanım senaryolarını açıklamaktadır.
Önemli noktalar
UIKit Dynamics, Apple tarafından iOS 7'de (2013) tanıtılan bir fizik simülasyon framework'üdür. UIView.animate (doğrusal geçişler) ve Core Animation (katman animasyonu) aksine, UIKit Dynamics gerçek fiziksel etkileşimleri simüle eder: yerçekimi, çarpışmalar, kuvvetler, esneklik ve sürtünme. Geliştirici UIDynamicAnimator'a davranışlar ekler ve sistem her kare için fiziği otomatik olarak hesaplar.
Framework 60/120 FPS'de çalışır ve katı cisim simülasyonuna dayalı yerleşik bir fizik motoru kullanır. UIKit Dynamics fizik veya matematik bilgisi gerektirmez — sadece hazır bir davranış uygulayın ve parametrelerini yapılandırın.
Apple'a göre UIKit Dynamics UI efektleri (kart yığını animasyonu, ikon sallama, arayüz fiziği) için uygundur, ancak oyunlar için tasarlanmamıştır — oyunlar için SceneKit veya SpriteKit kullanın.
UIDynamicAnimator, UIKit Dynamics'in merkezi sınıfıdır. Bir reference view (genellikle denetleyicinin view'i) ile başlatılır ve tüm aktif davranışları yönetir. Her karede UIDynamicAnimator, fizik yasalarına göre eklenen tüm öğelerin konumlarını, hızlarını ve ivmelerini yeniden hesaplar.
addBehavior yöntemi bir davranış (veya karmaşık bir UIDynamicBehavior) ekler, removeBehavior onu kaldırır. Tüm nesneler durma durumuna ulaştığında (çarpışma ve kuvvet olmadan devam) animatör otomatik olarak duraklatılır. Temsilci yöntemi — UIDynamicAnimatorDelegate — simülasyonun duraklatılması ve devam ettirilmesi hakkında bildirimde bulunur.
Fiziğe katılan herhangi bir nesne UIDynamicItem protokolünü uygulamalıdır. UIView ve UICollectionViewLayoutAttributes zaten uygulamaktadır. Protokol şu özellikleri gerektirir: bounds, center, transform. Nesne özel ise — protokolü manuel olarak uygulayın.
UIKit Dynamics, her biri belirli bir fiziksel efekti modelleyen yedi yerleşik davranış türü içerir. Davranışlar birleştirilebilir: örneğin, yerçekimi + çarpışmalar + esneklik, düşen ve zıplayan nesnelerin efektini oluşturur.
| Behavior | Fiziksel etki | Anahtar parametreler |
|---|---|---|
| UIGravityBehavior | Yerçekimi (kuvvet vektörü) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Nesne ve sınır çarpışmaları | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Bağlantı (yay/kablo) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Sönümleme ile noktaya çekme | snapPoint, damping (0-1) |
| UIPushBehavior | İtme/dürtü (sürekli veya anlık) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Nesne fiziksel özellikleri | elasticity, friction, density, resistance |
| UIFieldBehavior | Kuvvet alanları (girdap, manyetik, radyal) | position, strength, falloff, region |
Gerçekçi nesne fiziği için aynı anda birden fazla davranış gerekir. Örneğin, düşen bir kart için: UIGravityBehavior (yerçekimi kuvveti), UICollisionBehavior (tabanla çarpışma), UIDynamicItemBehavior (esneklik: zıplama için 0,4). Tüm davranışlar tek bir UIDynamicAnimator'a eklenir.
UIKit Dynamics için Swift kodu bir UIDynamicAnimator oluşturur ve davranışlar ekler. Aşağıdaki örnek, birden fazla nesneyle yerçekimi, çarpışmalar ve özel fiziksel özellikleri gösterir.
import UIKit
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Reference view ile animatör oluştur
animator = UIDynamicAnimator(referenceView: view)
// 2. Düşen nesneler oluştur
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. Yerçekimi
let gravity = UIGravityBehavior(items: [redView, blueView])
gravity.gravityDirection = CGVector(dx: 0, dy: 1)
gravity.magnitude = 0.8
animator.addBehavior(gravity)
// 4. Çarpışmalar
let collision = UICollisionBehavior(items: [redView, blueView])
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
// 5. Fiziksel özellikler
let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
itemBehavior.elasticity = 0.6
itemBehavior.friction = 0.3
itemBehavior.density = 1.0
animator.addBehavior(itemBehavior)
// 6. Dokunmada Snap davranışı
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
}
@objc
func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
// Her nesne için Snap davranışı
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("Çarpışma konumu: (nokta)")
}
}Örnek, yerçekimi, çarpışmalar ve fiziksel özelliklere sahip iki View oluşturur. Dokunulduğunda UISnapBehavior, 0,5 sönümleme ile nesneleri dokunma noktasına çeker. UICollisionBehaviorDelegate, ses ve görsel efektler için çarpışma başlangıcını izler.
UIKit Dynamics, iOS uygulamalarında oyun dışı arayüz fiziği için kullanılır. Popüler senaryolar: kart yığını animasyonu (merkeze çekmek için UISnapBehavior), hata durumunda ekran sallama (UIDynamicItemBehavior + UIPushBehavior), onboarding'te "kayan yıldız" efekti (gravity + collision + field behavior).
Performans için UIKit Dynamics, fizikli 15-20'den fazla eşzamanlı nesne önermez. Her nesne her karede çarpışma ve kuvvet hesaplaması gerektirir. Limit aşılırsa UIView yerine CALayer kullanın — Core Animation katmanları daha verimli işler.
Sıkça sorulan sorular
UIKit Dynamics, katı cisim simülasyonuna dayalı fiziksel etkileşimleri (yerçekimi, çarpışmalar, kuvvetler) modeller. Core Animation, CALayer özelliklerini (position, opacity, transform) belirtilen bir zaman eğrisi boyunca canlandırır. Dynamics etkileşimli fizik için uygundur, Core Animation önceden tanımlanmış geçişler için.
SwiftUI'de UIKit Dynamics için doğrudan destek yoktur. Fizik efektleri için UIViewRepresentable içinde UIKitView + UIDynamicAnimator kullanın veya SwiftUI'de Animation.spring() ve withAnimation() ile özel animasyonlar kullanın.
animator.removeAllBehaviors() çağırın — bu tüm aktif fiziksel davranışları kaldırır. Tüm nesneler duruma ulaştığında animatör otomatik olarak duraklar. Geçici duraklama için animator.isPaused özelliğini kullanın veya ayrı ayrı davranışları kaldırın.
Apple, tam fizikli (yerçekimi + çarpışmalar + kuvvetler) 15-20 nesneden fazla olmamasını önerir. Toplu animasyonlar için UIFieldBehavior kullanın — kuvvetleri ikili çarpışmalar olmadan merkezi olarak hesaplar, CPU yükünü azaltır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun