UIKit Dynamics — iOS (UIKit) da fizik animatsiya freymvorki bo'lib, View-larga real fizika qonunlari bo'yicha o'zaro ta'sir qilish imkonini beradi: gravitatsiya, to'qnashishlar, elastiklik va tortish kuchlari. Maqola UIDynamicAnimator komponentlari, behavior turlari va amaliy qo'llash stsenariylarini tushuntiradi.
Asosiy
UIKit Dynamics — Apple tomonidan iOS 7 (2013) da taqdim etilgan fizik modellashtirish freymvorki. UIView.animate (chiziqli o'tishlar) va Core Animation (qatlam animatsiyasi) dan farqli o'laroq, UIKit Dynamics real fizik o'zaro ta'sirlarni modellashtiradi: gravitatsiya, to'qnashishlar, kuchlar, elastiklik va ishqalanish. Dasturchi UIDynamicAnimator ga behavior lar qo'shadi va tizim har bir kadr uchun fizikani avtomatik hisoblaydi.
Freymvork 60/120 FPS chastotada ishlaydi va rigid body simulation ga asoslangan ichki fizika dvigatelidan foydalanadi. UIKit Dynamics fizika yoki matematika bilimini talab qilmaydi — tayyor behavior ni qo'llab parametrlarni sozlash kifoya.
Apple ma'lumotlariga ko'ra, UIKit Dynamics UI effektlari (kartalar to'plami animatsiyasi, ikonkalarning titrashi, interfeys fizikasi) uchun mos, lekin o'yinlar uchun mo'ljallanmagan — o'yinlar uchun SceneKit yoki SpriteKit dan foydalaning.
UIDynamicAnimator — UIKit Dynamics ning markaziy klassi. Reference view (odatda kontroller view i) bilan ishga tushiriladi va barcha aktiv behavior larni boshqaradi. Har bir kadrda UIDynamicAnimator fizika qonunlariga muvofiq barcha qo'shilgan elementlarning pozitsiyalari, tezliklari va tezlanishlarini qayta hisoblaydi.
addBehavior metodi bitta behavior (yoki murakkab UIDynamicBehavior) qo'shadi, removeBehavior — olib tashlaydi. Animator barcha obyektlar tinch holatga erishganda avtomatik to'xtaydi (to'qnashuv va kuchlarsiz). Delegate metodi — UIDynamicAnimatorDelegate — simulyatsiyaning pauza va davom etishi haqida xabar beradi.
Fizikada ishtirok etadigan har bir obyekt UIDynamicItem protokolini amalga oshirishi kerak. UIView va UICollectionViewLayoutAttributes uni allaqachon amalga oshiradi. Protokol xususiyatlarni talab qiladi: bounds, center, transform. Agar obyekt maxsus bo'lsa — protokolni qo'lda amalga oshiring.
UIKit Dynamics yettita o'rnatilgan behavior turini o'z ichiga oladi, ularning har biri ma'lum bir fizik effektni modellashtiradi. Behavior lar birlashtirilishi mumkin: masalan, gravitatsiya + to'qnashishlar + elastiklik tushayotgan va sakrab chiqayotgan obyektlar effektini yaratadi.
| Behavior | Fizik effekt | Asosiy parametrlar |
|---|---|---|
| UIGravityBehavior | Gravitatsiya (kuch vektori) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Obyektlar va chegaralarning to'qnashishi | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Bog'lanish (prujina/kabel) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Nuqtaga damping bilan tortilish | snapPoint, damping (0-1) |
| UIPushBehavior | Itarish/impuls (uzluksiz yoki oniy) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Obyektning fizik xususiyatlari | elasticity, friction, density, resistance |
| UIFieldBehavior | Kuch maydonlari (girdob, magnit, radius) | position, strength, falloff, region |
Realistik fizika uchun bir vaqtning o'zida bir nechta behavior kerak. Masalan, tushayotgan karta uchun: UIGravityBehavior (tortish kuchi), UICollisionBehavior (tub bilan to'qnashish), UIDynamicItemBehavior (sakrash uchun elasticity: 0.4). Barcha behavior lar bitta UIDynamicAnimator ga qo'shiladi.
Swift kodi UIKit Dynamics uchun UIDynamicAnimator yaratadi va behavior lar qo'shadi. Quyidagi misol bir nechta obyekt bilan gravitatsiya, to'qnashishlar va maxsus fizik xususiyatlarni ko'rsatadi.
import UIKit
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Reference view bilan animator yaratamiz
animator = UIDynamicAnimator(referenceView: view)
// 2. Tushayotgan obyektlarni yaratamiz
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. Gravitatsiya
let gravity = UIGravityBehavior(items: [redView, blueView])
gravity.gravityDirection = CGVector(dx: 0, dy: 1)
gravity.magnitude = 0.8
animator.addBehavior(gravity)
// 4. To'qnashishlar
let collision = UICollisionBehavior(items: [redView, blueView])
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
// 5. Fizik xususiyatlar
let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
itemBehavior.elasticity = 0.6
itemBehavior.friction = 0.3
itemBehavior.density = 1.0
animator.addBehavior(itemBehavior)
// 6. Teginish bilan Snap xatti-harakati
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
}
@objc
func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
// Har bir obyekt uchun Snap xatti-harakati
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("To'qnashish: (point)")
}
}Misol gravitatsiya, to'qnashishlar va fizik xususiyatlar bilan ikkita View yaratadi. UISnapBehavior teginishda obyektlarni 0.5 damping bilan teginish nuqtasiga tortadi. UICollisionBehaviorDelegate tovush va vizual effektlar uchun to'qnashishlarning boshlanishini kuzatadi.
UIKit Dynamics iOS ilovalarida o'yin bo'lmagan interfeys fizikasi uchun qo'llaniladi. Mashhur stsenariylar: kartalar to'plami animatsiyasi (markazga tortish uchun UISnapBehavior), xato paytida ekranni silkitish (UIDynamicItemBehavior + UIPushBehavior), onboardingda "tushayotgan yulduzlar" effekti (gravity + collision + field behavior).
Unumdorlik uchun UIKit Dynamics 15-20 ta bir vaqtda fizik obyektdan ko'p bo'lmasligini tavsiya qiladi. Har bir obyekt har bir kadrda to'qnashish va kuch hisoblarini talab qiladi. Limit oshib ketganda UIView o'rniga CALayer dan foydalaning — Core Animation qatlamlarni samaraliroq qayta ishlaydi.
Tez-tez beriladigan savollar
UIKit Dynamics rigid body simulyatsiyasiga asoslangan fizik o'zaro ta'sirlarni (gravitatsiya, to'qnashishlar, kuchlar) modellashtiradi. Core Animation — CALayer xususiyatlarining (position, opacity, transform) berilgan vaqt egri chizig'i bo'yicha animatsiyasi. Dynamics interaktiv fizika uchun, Core Animation esa oldindan belgilangan o'tishlar uchun mos.
UIKit Dynamics ning SwiftUI da to'g'ridan-to'g'ri qo'llab-quvvatlanishi yo'q. Fizik effektlar uchun UIViewRepresentable ichida UIKitView + UIDynamicAnimator yoki SwiftUI da Animation.spring() va withAnimation() orqali maxsus animatsiyalardan foydalaning.
animator.removeAllBehaviors() ni chaqiring — bu barcha aktiv fizik behavior larni olib tashlaydi. Animator barcha obyektlar tinch holatga erishganda avtomatik to'xtaydi. Vaqtinchalik pauza uchun animator.isPaused xususiyatidan foydalaning yoki alohida behavior larni olib tashlang.
Apple to'liq fizika bilan (gravitatsiya + to'qnashishlar + kuchlar) 15-20 ta obyektdan ko'p bo'lmaslikni tavsiya qiladi. Ommaviy animatsiyalar uchun UIFieldBehavior dan foydalaning — u kuchlarni juft-juft to'qnashuvlarsiz markazlashtirilgan holda hisoblaydi, bu esa CPU yukini kamaytiradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.