Home > UIKit Dynamics
UIKit Dynamics
UIKit์ ๋ฌผ๋ฆฌ ์์ง์ผ๋ก UI ์์์ ์ค๋ ฅ, ์ถฉ๋, ํ์ฑ, ์ค๋ ๋ฑ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ๋์์ ๋ถ์ฌํฉ๋๋ค. ์์ฐ์ค๋ฌ์ด ์ธํฐ๋์ ๊ณผ ์ ๊ธฐ์ ์ธ UI ๋ชจ์ ์ ๋ง๋ค์ด ๋ด ๋๋ค.
๊ฐ์
UIKit Dynamics๋ UIKit ๋ทฐ์ ์ค์๊ฐ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
์ ์ ์ฉํ๋ ํ๋ ์์ํฌ์
๋๋ค. UIDynamicAnimator๊ฐ ๋ฌผ๋ฆฌ ์์ง ์ญํ ์ ํ๋ฉฐ, ๋ค์ํ UIDynamicBehavior(์ค๋ ฅ, ์ถฉ๋, ๋ถ์ฐฉ, ์ค๋
, ํธ์)๋ฅผ ์กฐํฉํ์ฌ UI ์์์ ๋์์ ์ ์ํฉ๋๋ค.
SpriteKit๊ณผ ๋ฌ๋ฆฌ ์ผ๋ฐ UIView๋ฅผ ๋ฌผ๋ฆฌ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด UI ์ปดํฌ๋ํธ์ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ์ธํฐ๋์
์ ์์ฐ์ค๋ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. SwiftUI์์๋ UIViewRepresentable์ ํตํด ํตํฉํฉ๋๋ค.
์ธ์ ์ฌ์ฉํ๋์?
- UI ์นด๋/ํจ๋์ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ๋๋๊ทธ & ๋๋กญ
- ์ค๋ ฅ์ ๋ฐ์ํ๋ ์ธํฐ๋ํฐ๋ธ ๋ฉ๋ด
- ํ์ฑ ์๋ ์ค๋ ํจ๊ณผ (์์ด์ฝ ์ ๋ ฌ, ์ฌ๋ผ์ด๋ ๋ฑ)
- ์ถฉ๋ ๊ธฐ๋ฐ ์ธํฐ๋์ (๋ฒํผ, ํ๋ณผ ์คํ์ผ UI)
- ๊ต์ก์ฉ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
ํต์ฌ API
UIDynamicAnimator์ Behavior
class PhysicsViewController: UIViewController {
var animator: UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
animator = UIDynamicAnimator(referenceView: view)
let card = UIView(frame: CGRect(x: 150, y: 50, width: 80, height: 80))
card.backgroundColor = .systemBlue
card.layer.cornerRadius = 12
view.addSubview(card)
// ์ค๋ ฅ
let gravity = UIGravityBehavior(items: [card])
// ์ถฉ๋ (ํ๋ฉด ๊ฒฝ๊ณ)
let collision = UICollisionBehavior(items: [card])
collision.translatesReferenceBoundsIntoBoundary = true
// ํ์ฑ
let itemBehavior = UIDynamicItemBehavior(items: [card])
itemBehavior.elasticity = 0.6
animator.addBehavior(gravity)
animator.addBehavior(collision)
animator.addBehavior(itemBehavior)
}
}
์ฃผ์ Behavior ์ ๋ฆฌ
| Behavior | ์ค๋ช |
|---|---|
UIGravityBehavior |
์์ดํ ์ ์ค๋ ฅ(๋ฐฉํฅ, ์ธ๊ธฐ) ์ ์ฉ |
UICollisionBehavior |
์์ดํ ๊ฐ ๋๋ ๊ฒฝ๊ณ์์ ์ถฉ๋ ๊ฐ์ง |
UIAttachmentBehavior |
๋ ์์ดํ ๋๋ ์ต์ปค ํฌ์ธํธ์ ์คํ๋ง/๊ณ ์ ์ฐ๊ฒฐ |
UISnapBehavior |
์์ดํ ์ ํน์ ์ง์ ์ผ๋ก ์ค๋ (๊ฐ์ ์ง๋) |
UIPushBehavior |
์๊ฐ์ (.instantaneous) ๋๋ ์ง์์ (.continuous) ํ ์ ์ฉ |
UIDynamicItemBehavior |
๋ง์ฐฐ, ํ์ฑ, ๋ฐ๋, ์ ํญ ๋ฑ ๋ฌผ๋ฆฌ ์์ฑ ์ค์ |
SwiftUI ํตํฉ
UIKit Dynamics๋ UIKit ๊ธฐ๋ฐ์ด๋ฏ๋ก SwiftUI์์ UIViewRepresentable ๋๋ UIViewControllerRepresentable๋ก ๋ํํ์ฌ ์ฌ์ฉํฉ๋๋ค.
struct DynamicsView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> PhysicsViewController {
PhysicsViewController()
}
func updateUIViewController(_ vc: PhysicsViewController, context: Context) {}
}
๋ฐ๋ชจ ๋ชฉ๋ก
| # | ๋ฐ๋ชจ | ์ค๋ช |
|---|---|---|
| 1 | Gravity Cards | ์ฌ๋ฌ ์นด๋์ ์ค๋ ฅ๊ณผ ์ถฉ๋์ ์ ์ฉํฉ๋๋ค. ๋๋ฐ์ด์ค๋ฅผ ๊ธฐ์ธ์ด๋ฉด ์ค๋ ฅ ๋ฐฉํฅ์ด ๋ฐ๋๋๋ค (์ด ๋ทฐ๋ Portrait ๋ฐฉํฅ์ผ๋ก ์๋ ์ ๊น). |
| 2 | Snap Grid | UISnapBehavior๋ก ๋๋๊ทธํ ์์ด์ฝ์ด ๊ฐ์ฅ ๊ฐ๊น์ด ๊ทธ๋ฆฌ๋ ์์น๋ก ์ค๋
๋ฉ๋๋ค. damping ์ฌ๋ผ์ด๋๋ก ์ค๋
๋๋์ ์กฐ์ ํฉ๋๋ค. |
| 3 | Collision Bubbles | ์ํ ๋ฒ๋ธ๋ค์ด ์๋ก ์ถฉ๋ํ๋ฉฐ ์์ ๋ฐฐ์น๋๋ ํ๊ทธ ํด๋ผ์ฐ๋. ํญํ๋ฉด ์ฃผ๋ณ์ผ๋ก ๋ฐ์ด๋ด๋ UIPushBehavior๊ฐ ์ ์ฉ๋ฉ๋๋ค. |
| 4 | Pendulum (Newtonโs Cradle) | UIAttachmentBehavior๋ก ์ค์ ๊ตฌํํ ๋ดํด์ ์๋. UISnapBehavior๋ก ๊ณต์ ๋๋๊ทธํด ์์ฐ์ค๋ฝ๊ฒ ๋์ ์ ์์ต๋๋ค. |
| 5 | Elastic Menu | UIAttachmentBehavior์ spring ์ค์ ์ผ๋ก ํ์ฑ ์๋ ๋ฉ๋ด. ์์ดํ
๊ฐ ์ฒด์ธ ์ฐ๊ฒฐ๋ก ํ ํญ๋ชฉ ๋น๊ธฐ๋ฉด ๋ค๋ฅธ ํญ๋ชฉ๋ ๋ฐ๋ผ์ต๋๋ค. |
์ค์ ํ
Best Practices
- UIKit Dynamics๋ ๊ธฐ์กด UIView๋ฅผ ๊ทธ๋๋ก ๋ฌผ๋ฆฌ ๊ฐ์ฒด๋ก ํ์ฉํ๋ฏ๋ก, ๋ณต์กํ UI์ ๋ฌผ๋ฆฌ ์ธํฐ๋์ ์ ์ถ๊ฐํ๊ธฐ ์ฝ์ต๋๋ค.
- ๊ฐ๋จํ UI ๋ฌผ๋ฆฌ(์นด๋ ์ค์์ดํ, ์ค๋ ์ ๋ ฌ)์๋ SpriteKit๋ณด๋ค UIKit Dynamics๊ฐ ์ ํฉํฉ๋๋ค.
- UISnapBehavior์
damping๊ฐ(0~1)์ผ๋ก ์ค๋ ์ โํ์ฑ ๋๋โ์ ์ ๋ฐํ๊ฒ ์กฐ์ ํ์ธ์. - ์ฌ๋ฌ Behavior๋ฅผ
UIDynamicBehavior์๋ธํด๋์ค ํ๋์ ๋ฌถ์ผ๋ฉด ์ฝ๋ ๊ด๋ฆฌ๊ฐ ํธ๋ฆฌํฉ๋๋ค.
์ฃผ์ ์ฌํญ
- UIKit Dynamics๋ UIKit ์ ์ฉ์ด๋ฏ๋ก SwiftUI์์ ์ฐ๋ ค๋ฉด ๋ฐ๋์ UIViewRepresentable ๋ํผ๊ฐ ํ์ํฉ๋๋ค.
- ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ด ์์ ํ๋๋ฉด ์๋์ผ๋ก ์ผ์์ ์ง๋์ง๋ง, ๋ถํ์ํ Behavior๋ ๋ช ์์ ์ผ๋ก ์ ๊ฑฐํ์ธ์.
- ์์ญ ๊ฐ ์ด์์ ์์ดํ ์ ๋ณต์กํ Behavior๋ฅผ ์ ์ฉํ๋ฉด CPU ๋ถํ๊ฐ ์ฆ๊ฐํฉ๋๋ค. SpriteKit ์ ํ์ ๊ณ ๋ คํ์ธ์.
- Auto Layout๊ณผ UIKit Dynamics๋ ์ถฉ๋ํ ์ ์์ต๋๋ค. ๋ฌผ๋ฆฌ ๋์ ๋ทฐ๋ frame ๊ธฐ๋ฐ ๋ ์ด์์์ ์ฌ์ฉํ์ธ์.
UIDynamicAnimator์referenceView๊ฐ ํด์ ๋๋ฉด ์๋ฎฌ๋ ์ด์ ์ด ๋ฉ์ถ๋ฏ๋ก ๊ฐํ ์ฐธ์กฐ๋ฅผ ์ ์งํ์ธ์.