UIKit Dynamics — isang framework ng pisikal na animasyon sa iOS (UIKit) na nagpapahintulot sa View na makipag-ugnayan ayon sa mga batas ng tunay na pisika: gravity, banggaan, elasticity, at mga puwersa ng atraksyon. Ipinapaliwanag ng artikulo ang mga bahagi ng UIDynamicAnimator, mga uri ng behavior, at mga praktikal na sitwasyon ng paggamit.
Mga Pangunahing Punto
UIKit Dynamics — isang framework ng pisikal na pagmomodelo na ipinakilala ng Apple sa iOS 7 (2013). Hindi tulad ng UIView.animate (mga linear na transisyon) at Core Animation (animasyon ng mga layer), ginagaya ng UIKit Dynamics ang tunay na pisikal na interaksyon: gravity, banggaan, puwersa, elasticity, at friction. Nagdadagdag ang developer ng mga behavior sa UIDynamicAnimator, at awtomatikong kinakalkula ng system ang pisika para sa bawat frame.
Ang framework ay gumagana sa 60/120 FPS at gumagamit ng built-in na physics engine batay sa rigid body simulation. Ang UIKit Dynamics ay hindi nangangailangan ng kaalaman sa pisika o matematika — sapat na mag-apply ng handa na behavior at i-configure ang mga parameter.
Ayon sa Apple, ang UIKit Dynamics ay angkop para sa UI effect (animasyon ng stack ng cards, "panginginig" ng mga icon, pisika ng interface), ngunit hindi para sa mga laro — para sa mga laro gamitin ang SceneKit o SpriteKit.
UIDynamicAnimator — ang sentral na klase ng UIKit Dynamics. Ito ay na-initialize na may reference view (karaniwang view ng controller) at namamahala sa lahat ng aktibong behavior. Bawat frame, muling kinakalkula ng UIDynamicAnimator ang mga posisyon, bilis, at acceleration ng lahat ng idinagdag na elemento ayon sa mga batas ng pisika.
Ang paraang addBehavior ay nagdaragdag ng isang behavior (o kumplikadong UIDynamicBehavior), removeBehavior — nag-aalis. Awtomatikong humihinto ang Animator kapag ang lahat ng bagay ay umabot sa state ng pahinga (walang banggaan at puwersa). Ang paraang delegate — UIDynamicAnimatorDelegate — ay nag-aabiso tungkol sa pause at pagpapatuloy ng simulation.
Bawat bagay na kalahok sa pisika ay dapat magpatupad ng protocol na UIDynamicItem. Ang UIView at UICollectionViewLayoutAttributes ay naiimplementa na ito. Ang protocol ay nangangailangan ng mga property: bounds, center, transform. Kung ang bagay ay custom — implementahin ang protocol nang manu-mano.
UIKit Dynamics ay may pitong built-in na uri ng behavior, bawat isa ay gumagaya ng tiyak na pisikal na epekto. Ang mga behavior ay maaaring pagsamahin: halimbawa, gravity + banggaan + elasticity ay lumilikha ng epekto ng mga bumabagsak at tumatalbog na bagay.
| Behavior | Pisikal na Epekto | Mga Pangunahing Parameter |
|---|---|---|
| UIGravityBehavior | Gravity (vector ng puwersa) | gravityDirection (dx, dy), magnitude |
| UICollisionBehavior | Banggaan ng mga bagay at hangganan | collisionMode, translucence, collisionDelegate |
| UIAttachmentBehavior | Koneksyon (spring/kable) | anchorPoint, length, damping, frequency |
| UISnapBehavior | Pag-akit sa punto na may damping | snapPoint, damping (0-1) |
| UIPushBehavior | Pagtulak/impulse (tuloy-tuloy o instant) | pushDirection, magnitude, mode |
| UIDynamicItemBehavior | Pisikal na katangian ng bagay | elasticity, friction, density, resistance |
| UIFieldBehavior | Field ng puwersa (vortex, magnet, radius) | position, strength, falloff, region |
Para sa makatotohanang pisika ng isang bagay, kailangan ng maraming behavior nang sabay-sabay. Halimbawa, para sa bumabagsak na card: UIGravityBehavior (gravity force), UICollisionBehavior (banggaan sa ilalim), UIDynamicItemBehavior (elasticity: 0.4 para sa pagtalbog). Lahat ng behavior ay idinadagdag sa isang UIDynamicAnimator.
Ang Swift code para sa UIKit Dynamics ay lumilikha ng UIDynamicAnimator at nagdaragdag ng mga behavior. Ipinapakita ng halimbawa sa ibaba ang gravity na may maraming bagay, banggaan, at custom na pisikal na katangian.
import UIKit
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Gumagawa ng animator na may reference view
animator = UIDynamicAnimator(referenceView: view)
// 2. Gumagawa ng mga bumabagsak na bagay
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. Gravity
let gravity = UIGravityBehavior(items: [redView, blueView])
gravity.gravityDirection = CGVector(dx: 0, dy: 1)
gravity.magnitude = 0.8
animator.addBehavior(gravity)
// 4. Banggaan
let collision = UICollisionBehavior(items: [redView, blueView])
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
// 5. Mga pisikal na katangian
let itemBehavior = UIDynamicItemBehavior(items: [redView, blueView])
itemBehavior.elasticity = 0.6
itemBehavior.friction = 0.3
itemBehavior.density = 1.0
animator.addBehavior(itemBehavior)
// 6. Snap behavior sa pagpindot
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
}
@objc
func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
// Snap behavior para sa bawat bagay
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("Banggaan sa: (point)")
}
}Ang halimbawa ay lumilikha ng dalawang View na may gravity, banggaan, at pisikal na katangian. Ang UISnapBehavior sa pagpindot ay umaakit ng mga bagay sa punto ng pagpindot na may damping na 0.5. Ang UICollisionBehaviorDelegate ay sumusubaybay sa simula ng mga banggaan para sa sound at visual effect.
UIKit Dynamics ay ginagamit sa iOS applications para sa non-game na pisika ng interface. Mga sikat na senaryo: animasyon ng stack ng cards (UISnapBehavior para sa pag-akit sa gitna), pag-alog ng screen sa error (UIDynamicItemBehavior + UIPushBehavior), epekto ng "bumabagsak na mga bituin" sa onboarding (gravity + collision + field behavior).
Para sa performance, inirerekomenda ng UIKit Dynamics na hindi hihigit sa 15-20 sabay-sabay na bagay na may pisika. Bawat bagay ay nangangailangan ng kalkulasyon ng banggaan at puwersa sa bawat frame. Kapag lumampas sa limitasyon, gumamit ng CALayer sa halip na UIView — mas efficient na pinoproseso ng Core Animation ang mga layer.
Mga Madalas Itanong
UIKit Dynamics ay gumagaya ng pisikal na interaksyon (gravity, banggaan, puwersa) batay sa rigid body simulation. Core Animation — animasyon ng mga property ng CALayer (position, opacity, transform) ayon sa tiyak na time curve. Ang Dynamics ay angkop para sa interactive na pisika, Core Animation — para sa mga paunang natukoy na transisyon.
Walang direktang suporta para sa UIKit Dynamics sa SwiftUI. Para sa pisikal na epekto, gamitin ang UIKitView + UIDynamicAnimator sa loob ng UIViewRepresentable, o custom na animasyon sa pamamagitan ng Animation.spring() at withAnimation() sa SwiftUI.
Tumawag ng animator.removeAllBehaviors() — aalisin nito ang lahat ng aktibong pisikal na behavior. Awtomatikong humihinto ang Animator kapag ang lahat ng bagay ay umabot sa pahinga. Para sa pansamantalang pause, gamitin ang property na animator.isPaused o alisin ang mga indibidwal na behavior.
Inirerekomenda ng Apple na hindi hihigit sa 15-20 bagay na may buong pisika (gravity + banggaan + puwersa). Para sa mass animation, gamitin ang UIFieldBehavior — kinakalkula nito ang mga puwersa nang sentralisado nang walang pares-pares na banggaan, na nagbabawas ng CPU load.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din