UIKit Dynamics — iOS-da (UIKit) fiziki animasiya freymvorku olub, View-lərə real fizika qanunlarına əsasən qarşılıqlı təsir göstərməyə imkan verir: qravitasiya, toqquşmalar, elastiklik və cazibə qüvvələri. Məqalə UIDynamicAnimator komponentlərini, behavior növlərini və praktik tətbiq ssenarilərini izah edir.
Əsas
UIKit Dynamics — Apple tərəfindən iOS 7-də (2013) təqdim edilmiş fiziki modelləşdirmə freymvorkudur. UIView.animate (xətti keçidlər) və Core Animation (təbəqə animasiyası) fərqli olaraq, UIKit Dynamics real fiziki qarşılıqlı təsirləri modelləşdirir: qravitasiya, toqquşmalar, qüvvələr, elastiklik və sürtünmə. Developer UIDynamicAnimator-a behavior-lar əlavə edir və sistem hər kadr üçün fizikanı avtomatik hesablayır.
Freymvork 60/120 FPS tezliyində işləyir və rigid body simulation əsasında qurulmuş daxili fizika mühərrikindən istifadə edir. UIKit Dynamics fizika və ya riyaziyyat bilikləri tələb etmir — hazır behavior tətbiq edib parametrləri konfiqurasiya etmək kifayətdir.
Apple məlumatlarına görə, UIKit Dynamics UI effektləri (kart yığını animasiyası, ikonların titrəməsi, interfeys fizikası) üçün uyğundur, lakin oyunlar üçün nəzərdə tutulmayıb — oyunlar üçün SceneKit və ya SpriteKit istifadə edin.
UIDynamicAnimator — UIKit Dynamics-in mərkəzi sinfi. Reference view ilə (adətən kontrollerin view-i) işə salınır və bütün aktiv behavior-ları idarə edir. Hər kadrda UIDynamicAnimator fizika qanunlarına əsasən bütün elementlərin mövqelərini, sürətlərini və təcillərini yenidən hesablayır.
addBehavior metodu bir behavior (və ya mürəkkəb UIDynamicBehavior) əlavə edir, removeBehavior — silir. Animator bütün obyektlər istirahət vəziyyətinə çatdıqda avtomatik dayanır (toqquşma və qüvvə olmadan). Delegate metodu — UIDynamicAnimatorDelegate — simulyasiyanın fasiləsi və davamı barədə xəbərdarlıq edir.
Fizikada iştirak edən hər bir obyekt UIDynamicItem protokolunu tətbiq etməlidir. UIView və UICollectionViewLayoutAttributes artıq onu tətbiq edir. Protokol xüsusiyyətlər tələb edir: bounds, center, transform. Əgər obyekt xüsusidirsə — protokolu əl ilə tətbiq edin.
UIKit Dynamics yeddi daxili behavior növünü ehtiva edir, hər biri müəyyən fiziki effekti modelləşdirir. Behavior-lar birləşdirilə bilər: məsələn, qravitasiya + toqquşmalar + elastiklik düşən və sıçrayan obyektlər effekti yaradır.
| Behavior | Fiziki effekt | Əsas parametrlər |
|---|---|---|
| UIGravityBehavior | Qravitasiya (qüvvə vektoru) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Obyektlərin və sərhədlərin toqquşması | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Əlaqə (yay/kabel) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Nöqtəyə damping ilə cazibə | snapPoint, damping (0-1) |
| UIPushBehavior | İtələmə/impuls (davamlı və ya ani) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Obyektin fiziki xüsusiyyətləri | elasticity, friction, density, resistance |
| UIFieldBehavior | Qüvvə sahələri (burulğan, maqnit, radius) | position, strength, falloff, region |
Realistik fizika üçün eyni anda bir neçə behavior lazımdır. Məsələn, düşən kart üçün: UIGravityBehavior (cazibə qüvvəsi), UICollisionBehavior (dib ilə toqquşma), UIDynamicItemBehavior (sıçrama üçün elasticity: 0.4). Bütün behavior-lar bir UIDynamicAnimator-a əlavə olunur.
Swift kodu UIKit Dynamics üçün UIDynamicAnimator yaradır və behavior-lar əlavə edir. Aşağıdakı nümunə çoxlu obyektlərlə qravitasiya, toqquşmalar və xüsusi fiziki xüsusiyyətləri nümayiş etdirir.
import UIKit
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Reference view ilə animator yaradırıq
animator = UIDynamicAnimator(referenceView: view)
// 2. Düşən obyektləri yaradırıq
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. Qravitasiya
let gravity = UIGravityBehavior(items: [redView, blueView])
gravity.gravityDirection = CGVector(dx: 0, dy: 1)
gravity.magnitude = 0.8
animator.addBehavior(gravity)
// 4. Toqquşmalar
let collision = UICollisionBehavior(items: [redView, blueView])
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
// 5. Fiziki xüsusiyyətlər
let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
itemBehavior.elasticity = 0.6
itemBehavior.friction = 0.3
itemBehavior.density = 1.0
animator.addBehavior(itemBehavior)
// 6. Toxunma ilə Snap davranışı
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
}
@objc
func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
// Hər obyekt üçün 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("Toqquşma: (point)")
}
}Nümunə qravitasiya, toqquşmalar və fiziki xüsusiyyətlərlə iki View yaradır. UISnapBehavior toxunma zamanı obyektləri 0.5 damping ilə toxunma nöqtəsinə çəkir. UICollisionBehaviorDelegate səs və vizual effektlər üçün toqquşmaların başlanğıcını izləyir.
UIKit Dynamics iOS tətbiqlərində qeyri-oyun interfeys fizikası üçün istifadə olunur. Populyar ssenarilər: kart yığını animasiyası (mərkəzə cəzb etmək üçün UISnapBehavior), xəta zamanı ekranı silkələmək (UIDynamicItemBehavior + UIPushBehavior), onboarding-də "düşən ulduzlar" effekti (gravity + collision + field behavior).
Məhsuldarlıq üçün UIKit Dynamics 15-20 eyni vaxtda fizika obyektindən çox olmaması tövsiyə olunur. Hər obyekt hər kadrda toqquşma və qüvvə hesablamaları tələb edir. Limit aşıldıqda UIView əvəzinə CALayer istifadə edin — Core Animation təbəqələri daha səmərəli idarə edir.
Tez-tez verilən suallar
UIKit Dynamics rigid body simulyasiyası əsasında fiziki qarşılıqlı təsirləri (qravitasiya, toqquşmalar, qüvvələr) modelləşdirir. Core Animation — CALayer xüsusiyyətlərinin (position, opacity, transform) verilmiş zaman əyrisinə əsasən animasiyası. Dynamics interaktiv fizika üçün, Core Animation isə əvvəlcədən təyin edilmiş keçidlər üçün uyğundur.
UIKit Dynamics-in SwiftUI-də birbaşa dəstəyi yoxdur. Fiziki effektlər üçün UIViewRepresentable daxilində UIKitView + UIDynamicAnimator və ya SwiftUI-də Animation.spring() və withAnimation() vasitəsilə xüsusi animasiyalardan istifadə edin.
animator.removeAllBehaviors() çağırın — bu bütün aktiv fiziki behavior-ları siləcək. Animator bütün obyektlər istirahətə çatdıqda avtomatik dayanır. Müvəqqəti fasilə üçün animator.isPaused xüsusiyyətindən istifadə edin və ya ayrı-ayrı behavior-ları silin.
Apple tam fizika ilə (qravitasiya + toqquşmalar + qüvvələr) 15-20 obyektdən çox olmamağı tövsiyə edir. Kütləvi animasiyalar üçün UIFieldBehavior istifadə edin — o, qüvvələri cüt-cüt toqquşmalar olmadan mərkəzləşdirilmiş şəkildə hesablayır, bu da CPU yükünü azaldır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun