๊ณ์ธต ์์ฑ์ ๋ํ basic, single-keyframe ์ ๋๋ฉ์ด์ ์ ์ ๊ณตํ๋ ๊ฐ์ฒด
๊ฐ์ฒด ์์ฑ
let animation = CABasicAnimation(keyPath: "position.x")
- initializer์ ํตํด keyPath๋ฅผ ์ง์ ํด์ ๊ฐ์ฒด ์์ฑ
let animation = CABasicAnimation()
animation.keyPath = "position.x"
- keyPath๋ ๋ฐ๋ก ์ง์ ๊ฐ๋ฅ
keyPath
var keyPath: String? { get set }
- receiver๊ฐ ์ ๋๋ฉ์ด์ ํ๋ ํค ํจ์ค๋ฅผ ์ง์ -> opacity, backgroundColor, position ๋ฑ (์ ์คํธ๋ง์ผ๋ก ๋ฐ๋๋ก ํ์๊น ... ใ ใ )
- ์ ๋๋ฉ์ด์ ๊ฐ๋ฅํ ๊ฐ์ ์ ๋งํฌ ์ฐธ์กฐ
Interpolation values
fromValue : receiver๊ฐ ์ฌ์ฉํ๋ ์ค์ ๊ฐ
toValue : receiver๊ฐ ์ฌ์ฉํ๋ end๊ฐ
byValue : receiver๊ฐ ์ฌ์ฉํ๋ perform relative interpolation (?)
Interpolation Values๋ฅผ ์ค์ ํ๋ ๋ฒ
fromValue, byValue, toValue ๋ชจ๋ ์ต์ ๋ ๊ฐ์ด๋ฉฐ ์ด ์ค ๋ ๊ฐ๋ ๋ฐ๋์ ๊ฐ์ ๊ฐ์ ธ์ผ ํจ
- fromValue, toValue: fromValue -> toValue
- fromValue, byValue: fromValue -> (fromValue + byValue)
- byValue, toValue: (toValue - byValue) -> toValue
- fromValue: fromValue -> property์ current presentation value
- toValue: target layer์ presentation layer์ KeyPath ํ์ฌ ๊ฐ -> toValue
- byValue: target layer์ presentation layer keyPath์ ํ์ฌ ๊ฐ + byValue ์ผ๋ก
opacity
- ์ ๋๋ฉ์ด์ ๊ฐ๋ฅํ ๊ฐ
- 0.0 ~ 1.0 ๊น์ง์ ๊ฐ์ ๊ฐ์ง๋ฉฐ default๋ 1.0
- ์ฝ๊ฒ ๋งํด ์ํ๊ฐ์ด์ง๋ง keyPath์๋ "opacity"
func opacityAnimation() {
let animation = CABasicAnimation()
animation.keyPath = "opacity"
animation.fromValue = 0
animation.toValue = 1
animation.duration = 1
testView.layer.add(animation, forKey: "basic")
}
ใด 0 ~ 1 ๊น์ง 1์ด ๋์
backgroundColor
var backgroundColor: CGColor? { get set }
- layer์ backgroundColor๋ฅผ ๋ณ๊ฒฝ. animatable ๊ฐ
- CGColor์ ๋๊ฒจ์ฃผ์ด์ผ ์ ์ ์๋ํจ. fromValue, toValue ๋ชจ๋ ์ ๋ชป ์ ๋ ฅํด๋ ์๋ฌ ํ์ค ์๋์ค๋ ์ฃผ์!
func backgroundColorAnimation() {
let animation = CABasicAnimation()
animation.keyPath = "backgroundColor"
animation.fromValue = UIColor.blue.cgColor
animation.toValue = UIColor.yellow.cgColor
animation.duration = 5
testView.layer.add(animation, forKey: "basic")
testView.layer.backgroundColor = UIColor.yellow.cgColor
}
ใด receiver์ backgroundColor์ fromValue ํ๋์์์ toValue ๋ ธ๋์์ผ๋ก ๋ณ๊ฒฝํ๋ ์ฝ๋. ์ ๋๋ฉ์ด์ ์ด ๋ค ๋๋ ๋ค ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ฐ์ ๋ณ๊ฒฝํด ์ฃผ์ด์ผ ๋ง์ง๋ง ์ ๋๋ฉ์ด์ ๊ฐ์์ ๋๋ ๊ฒ์ฒ๋ผ ํ ์ ์์
position
var position: CGPoint { get set }
- position์ anchorPoint ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋๋ฐ ์ด๋ anchorPoint๋ layer์ bound์ center ๊ฐ (x point๋ผ๊ณ x ๊ฐ ๋๊ฒจ ์ฃผ๋ ๊ฒ ์๋. ์ขํ๊ณ๋ฅผ ์ดํดํ ํ์๊ฐ ์์)
- ์ด๋ํ๊ณ ์ ํ๋ ์ขํ๊ฐ x, y๋ผ๋ฉด toValue์ ์ ๋ฌํด์ผ ํ๋ ๊ฐ์ [x+(width/2), y+(height/2)] ๊ฐ ๋๋ฉฐ ์ฝ๊ฒ center ๊ฐ์ ์ฌ์ฉํด์ ๋๊ธฐ๋ฉด ๊ณ์ฐํ๊ธฐ ์ฌ์ (toValue, fromValue ๋ชจ๋ anchorPoint์ด๋ฏ๋ก ์ฃผ์)
func positionAnimation() {
let animation = CABasicAnimation()
animation.keyPath = "position.x"
animation.fromValue = testView.center.x
animation.toValue = 300
animation.duration = 3
testView.layer.add(animation, forKey: nil)
testView.layer.position = CGPoint(x: 300, y: testView.center.y)
}
- ์์ ์ฝ๋๋ x point๋ง ๋ณ๊ฒฝํ๋ ์ฝ๋์ด๋ฉฐ, ์ ๋ฐ์ดํธ ์ํด์ ๋ง์ง๋ง์ layer.position ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋จ
let animation = CABasicAnimation(keyPath: "position")
animation.fromValue = [0, 0]
animation.toValue = [100, 100]
- ์ถ์ฒ : apple developer document
scale
var transform: CATransform3D { get set }
- scale ๊ฐ์ ๋ณ๊ฒฝ. CATransform3D ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์ layer ์ ๋ฐ์ดํธ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ CATransform3DMakeScale ๋ฅผ ์ฌ์ฉ
func scaleAnimation() {
let animation = CABasicAnimation()
animation.keyPath = "transform.scale.x"
animation.fromValue = 1
animation.toValue = 2
animation.duration = 3
testView.layer.add(animation, forKey: nil)
testView.layer.transform = CATransform3DMakeScale(2, 1.0, 1.0)
}
- x๋ฅผ 2๋ฐฐ๋ก ๋ณ๊ฒฝํ๋ ์ฝ๋. duration ๋์ animation ์ผ์ด๋๋ฉฐ ๋๋ ํ layer์ ์ ๋ฐ์ดํธ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ CATransform3DMakeScale๋ก ๊ฐ ๋ณ๊ฒฝ ์ด๋ ์ธ์๋ ์์๋๋ก x, y, z
๐ฆ ์ด์ํ ์ ์ด๋ ๋ฌธ์ ์ ๋๊ธ ๋ถํ๋๋ ค์!
์ฐธ๊ณ ์ฌ์ดํธ ๋ฐ ๋์
https://developer.apple.com/documentation/quartzcore/cabasicanimation
https://github.com/jrasmusson/swift-arcade/blob/master/Animation/CoreAnimation/Intro/README.md
๋๊ธ