Project 11 - Animationโ˜๐Ÿป

DaYยท2021๋…„ 4์›” 11์ผ
1

iOS

๋ชฉ๋ก ๋ณด๊ธฐ
28/52
post-thumbnail

Animate

options

  • .allowUserInteraction : ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹คํ–‰ ์ค‘ user interface ํ™œ์„ฑํ™”
  • .repeat : ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฌดํ•œ ๋ฐ˜๋ณต
  • .autoreverse : ์• ๋‹ˆ๋ฉ”์ด์…˜ ์•ž๋’ค๋กœ ์‹คํ–‰ (๋ฐ˜๋ณต ์˜ต์…˜๊ณผ ๊ฒฐํ•ฉ ํ•„์ˆ˜)
  • .curveEaseInOut : ๋นจ๋ผ์กŒ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Š๋ ค์ง€๋Š” ํšจ๊ณผ
  • .curveEaseIn : ์ ์  ๋นจ๋ผ์ง
  • .curveEaseOut : ์ ์  ๋Š๋ ค์ง
  • .transitionFlipFromLeft : ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ๋’ค์ง‘ํžˆ๋Š” ํšจ๊ณผ

์ƒ‰์ƒ ๋ฐ”๊พธ๊ธฐ

private func changeColor(_ color: UIColor) {
    UIView.animate(withDuration: self.duration, animations: {
        self.animateView.backgroundColor = color
    }, completion: nil)
}

ํšŒ์ „ํ•˜๊ธฐ

private func rotateView(_ angel: Double) {
    UIView.animate(withDuration: duration, delay: delay, options: [.repeat], animations: {
        self.animateView.transform = CGAffineTransform(rotationAngle: CGFloat(angel))
    }, completion: nil)
}

CGAffineTransform
๋ทฐ์˜ ํ”„๋ ˆ์ž„์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  2D ๊ทธ๋ž˜ํ”ฝ์„ ๊ทธ๋ ค์ค€๋‹ค.
๊ฐ์ฒด๋ฅผ ํšŒ์ „, ํฌ๊ธฐ ์กฐ์ •, ๋ณ€ํ™˜ ๋˜๋Š” ๊ธฐ์šธ์ด๋Š” ๋ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค์ค‘ ์ƒ‰์ƒ ๋ฐ”๊พธ๊ธฐ

private func multiColor(_ firstColor: UIColor, _ secondColor: UIColor) {
    UIView.animate(withDuration: duration, animations: {
        self.animateView.backgroundColor = firstColor
        }, completion: { finished in
            self.changeColor(secondColor)
    })
}

์œ„์น˜ ๋ฐ”๊พธ๊ธฐ

private func multiPosition(_ firstPosition: CGPoint, _ secondPosition: CGPoint) {
    func simplePosition(_ position: CGPoint) {
        UIView.animate(withDuration: self.duration, animations: {
            self.animateView.frame.origin = position
        }, completion: nil)
    }
        
    UIView.animate(withDuration: self.duration, animations: {
        self.animateView.frame.origin = firstPosition
    }, completion: { finished in
        simplePosition(secondPosition)
    })
}

์ปค๋ธŒ

private func curvePath(_ endPoint: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint) {
    let path = UIBezierPath()
        
    path.move(to: self.animateView.center)
    path.addCurve(to: endPoint, controlPoint1: controlPoint1, controlPoint2: controlPoint2)
        
    let anim = CAKeyframeAnimation(keyPath: "position")
    anim.path = path.cgPath
    anim.duration = self.duration
        
    self.animateView.layer.add(anim, forKey: "animate position along path")
    self.animateView.center = endPoint
}

UIBezierPath
์ง์„  ๋ฐ ๊ณก์„ ์œผ๋กœ ๋œ path ์ปค์Šคํ…€

CAKeyframeAnimation
ํŠน์ • ์‹œ๊ฐ„(ํ‚ค ํ”„๋ ˆ์ž„)์— ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ๊ฐ’์„ ์ง€์ •ํ•˜๊ณ , ๊ทธ ์‚ฌ์ด์˜ ๊ฐ’์„ ๋ณด๊ฐ„(interpolation)ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„
์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์ด ํŠ€์–ด์˜ฌ๋ž์„ ๋•Œ๋ฅผ ๊ฐ€์ •ํ•˜๋ฉด, ๊ณต ์œ„์น˜ ์ดˆ๊ธฐ๊ฐ’, ํŠ€์–ด ์˜ค๋ฅธ ์ตœ๋Œ“๊ฐ’, ๋‹ค์‹œ ๋ฐ”๋‹ฅ์— ๋–จ์–ด์กŒ์„ ๋•Œ์˜ ๊ฐ’๋งŒ ์ง€์ •ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๊ฐ’์€ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐ๋˜๋„๋ก ํ•ด์ค€๋‹ค.

์ƒ‰๊ณผ ํฌ๊ธฐ ๋ฐ”๊พธ๊ธฐ

private func colorFrameChange(_ firstFrame: CGRect, _ secondFrame: CGRect, _ thirdFrame: CGRect, _ firstColor: UIColor, _ secondColor: UIColor, _ thirdColor: UIColor) {
    UIView.animate(withDuration: self.duration, animations: {
        self.animateView.backgroundColor = firstColor
        self.animateView.frame = firstFrame
    }, completion: { finished in
        UIView.animate(withDuration: self.duration, animations: {
            self.animateView.backgroundColor = secondColor
            self.animateView.frame = secondFrame
        }, completion: { finished in
            UIView.animate(withDuration: self.duration, animations: {
                self.animateView.backgroundColor = thirdColor
                self.animateView.frame = thirdFrame
            }, completion: nil)
        })
    })
}

ํ๋ ค์ง€๊ธฐ

private func viewFadeIn() {
    let secondView = UIImageView(image: UIImage(named: "2"))
        
    secondView.frame = self.animateView.frame
    secondView.alpha = 0.0
        
    view.insertSubview(secondView, aboveSubview: self.animateView)
        
    UIView.animate(withDuration: duration, delay: delay, options: .curveEaseOut, animations: {
        secondView.alpha = 1.0
        self.animateView.alpha = 0.0
    }, completion: nil)
}

ํ„ฐ์ง€๊ธฐ

private func Pop() {
    UIView.animate(withDuration: duration / 4, animations: {
        self.animateView.transform = CGAffineTransform(scaleX: CGFloat(self.scale), y: CGFloat(self.scale))
    }, completion: { finished in
        UIView.animate(withDuration: self.duration / 4, animations: {
            self.animateView.transform = CGAffineTransform.identity
        })
    })
}

CGAffineTransform.identity
์›๋ž˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ

๋‹ค์ค‘ ์•ก์…˜ - .concatenating

private func animation(_ view: UIView) {
    let scaleAnimation = CGAffineTransform(scaleX: 2.0, y: 2.0)
    let rotateAnimation = CGAffineTransform(rotationAngle: .pi)
    let moveAnimation = CGAffineTransform(translationX: 0, y: -200)
        
    let concat = scaleAnimation.concatenating(rotateAnimation).concatenating(moveAnimation)
        
    UIView.animate(withDuration: 1, delay: 1, options: [], animations: {
        view.transform = concat
    }, completion: nil)
}

0๊ฐœ์˜ ๋Œ“๊ธ€