UIKit Dynamics — iOS'ta etkileşim fiziği

Yazar: IT Sectr Yayınlanma: 2026-03-01 Okuma süresi: 8 dk

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

  • UIDynamicAnimator — davranışları ve nesneleri birbirine bağlayan fiziksel animasyon motoru
  • UIGravityBehavior — yön vektörü ve ivme büyüklüğü ile yerçekimi simülasyonu
  • UICollisionBehavior — View'ler ve reference view sınırları arasındaki çarpışmaları işler
  • UIDynamicItemBehavior — fiziksel özelliklerin yapılandırması: esneklik, yoğunluk, sürtünme
  • UIAttachmentBehavior — yay veya kablo efekti ile iki nokta arasındaki bağlantı

UIKit Dynamics nedir?

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 — fizik motoru

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.

UIDynamicItem — animasyon protokolü

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.

Dynamic Behaviors türleri

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.

BehaviorFiziksel etkiAnahtar parametreler
UIGravityBehaviorYerçekimi (kuvvet vektörü)gravityDirection (dx, dy), magnitude
UICollisionBehaviorNesne ve sınır çarpışmalarıcollisionMode, translucence, collisionDelegate
UIAttachmentBehaviorBağlantı (yay/kablo)anchorPoint, length, damping, frequency
UISnapBehaviorSönümleme ile noktaya çekmesnapPoint, damping (0-1)
UIPushBehaviorİtme/dürtü (sürekli veya anlık)pushDirection, magnitude, mode
UIDynamicItemBehaviorNesne fiziksel özelliklerielasticity, friction, density, resistance
UIFieldBehaviorKuvvet alanları (girdap, manyetik, radyal)position, strength, falloff, region

Davranışları birleştirme

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.

Swift kod örnekleri

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.

swift
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.

Pratik kullanım senaryoları

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 Core Animation'dan nasıl farklıdır?

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 kullanılabilir mi?

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.

UIKit Dynamics nasıl durdurulur?

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.

Aynı anda kaç nesne canlandırılabilir?

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

  • UIKit Dynamics — yerçekimi, çarpışma ve kuvvet simülasyonu ile iOS fiziksel animasyon framework'ü
  • UIDynamicAnimator — davranışları yöneten ve her karede fiziği hesaplayan motor
  • 7 davranış türü — UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior, UISnapBehavior, UIPushBehavior, UIDynamicItemBehavior, UIFieldBehavior
  • Birleştirme — gravity + collision + itemBehavior sıçramalı gerçekçi düşme fiziği oluşturur
  • UIDynamicItem — fizik katılımcı nesneler için protokol (UIView varsayılan olarak uygular)
  • Sınırlama — tam fizikte 20'den fazla nesne olmamalı, oyunlar ve karmaşık sahneler için uygun değil
  • SwiftUI — UIKit Dynamics'i entegre etmek için UIViewRepresentable kullanın

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.

Projeyi tartış

Ayrıca okuyun