Notice
Recent Posts
Recent Comments
Link
ยซ   2024/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

๐Ÿ’ˆ ch11 ํ˜„์ƒ๊ธˆ ๋žญํ‚น์•ฑ ์ฝ”๋“œ๋ฆฌ๋ทฐ(Animation)๐Ÿ’ˆ ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/ํŒจ์บ (์˜ฌ์ธ์›)

๐Ÿ’ˆ ch11 ํ˜„์ƒ๊ธˆ ๋žญํ‚น์•ฑ ์ฝ”๋“œ๋ฆฌ๋ทฐ(Animation)๐Ÿ’ˆ

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 6. 22. 18:07

โœ… ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ch11์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค‘์ ์œผ๋กœ ํ•˜์—ฌ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•  ์ƒ๊ฐ์ด์•ผ.

 

์ด ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ธฐ ์ „! ์ž์„ธํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด [๊ฐœ๋…ํŽธ]์„ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž˜

2021.06.22 - [iOS/ํŒจ์บ ๊ณต๋ถ€] - ๐Ÿ’ˆ ch11 Animation - ๊ฐœ๋…ํŽธ๐Ÿ’ˆ

 

๐Ÿ’ˆ ch11 Animation - ๊ฐœ๋…ํŽธ๐Ÿ’ˆ

์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜์ž! โœ… ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋ž€? ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ทฐ์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ด์šฉํ•˜๋ฉด ์•ฑ์„ ๋” ์™„์„ฑ๋„ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ณผํ•˜

rldd.tistory.com

 

๊ฐœ๋… ํŽธ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด

1. ์ œ์•ฝ์กฐ๊ฑด์„ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜,

2. ๋ทฐ๋ฅผ ํ†ตํ•ด constraint๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด.

 

1๏ธโƒฃ ์ œ์•ฝ์กฐ๊ฑด์„ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ œ์•ฝ์กฐ๊ฑด์„ IBOulet ์—ฐ๊ฒฐํ•œ ๋ชจ์Šต

์ œ์•ฝ์กฐ๊ฑด๋„ ๋ฒ„ํŠผ์ด๋‚˜ ๋ ˆ์ด๋ธ” ๋“ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ IBOulet์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์ง์ ‘ ์ปจํŠธ๋กค์ด ๊ฐ€๋Šฅํ•ด.

 

โœ… ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ์‚ฌ์ „ ์ค€๋น„๊ฐ€ ํ•„์š”ํ•ด.

1. ๋ฉ”๋ชจ๋ฆฌ์— ๋ทฐ๊ฐ€ ์˜ฌ๋ผ์™”์„ ๋•Œ,

2. ๋ทฐ๊ฐ€ ํ™”๋ฉด์— ๋ณด์—ฌ์งˆ ๋•Œ, (์ฃผ์„์˜ ํ‘œํ˜„์ด ์กฐ๊ธˆ ๋ชจํ˜ธํ•ด)

 - ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ viewWillAppear์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋ทฐ๊ฐ€ ์˜ฌ๋ผ์˜ค๊ธฐ ์ „์— ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•ด์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ”์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด.

์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์ „ ์ค€๋น„!!

โœ… ์ž ๊ทธ๋Ÿผ ์‚ฌ์ „ ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์™”์„ ๋•Œ, ์–ด๋–ค ์•ก์…˜์„ ์ทจํ•˜๋Š”์ง€ ์ฝ”๋“œ๋กœ ํ•œ๋ฒˆ ๋ณผ๊นŒ?

    private func prepareAnimation() {
        nameLabelCenterX.constant = view.bounds.width // ํ™•์‹คํ•˜๊ฒŒ ๋ทฐ์˜ ๋ฐ”๊นฅ์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ
        bountyLabelCenterX.constant = view.bounds.width // ํ™•์‹คํ•˜๊ฒŒ ๋ทฐ์˜ ๋ฐ”๊นฅ์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ
    }

๋ฐ”๊นฅ์—์„œ ์งœ๋ผ๋ž€~ ํ•˜๊ณ  ๋“ฑ์žฅํ•˜๋Š” ์ฝ”๋“œ๋ผ์„œ ์ด๋Ÿฐ ์•ก์…˜์„ ์ทจํ•˜๊ฒŒ ๋ผ. 

์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๋ถ„์„ํ•ด๋ณด๋ฉด, ์•„๊นŒ ์—ฐ๊ฒฐํ–ˆ๋˜ ๋„ค์ž„๋ ˆ์ด๋ธ”๊ณผ ๋ฐ”์šดํ‹ฐ๋ ˆ์ด๋ธ”์˜ ์ œ์•ฝ์กฐ๊ฑด์„ ๋ทฐ์˜ ๋์ ์— ์œ„์น˜ํ•˜๊ฒŒ ํ•ด. 

์–ด๋–ค ๋ง์ด๋ƒ๋ฉด ์ €๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ๋ทฐ์˜ width์˜ ํฌ๊ธฐ ์ง€์ ์— label์˜ ์‹œ์ž‘์ง€์ ์ด ์žกํžˆ๊ฒŒ ๋˜์„œ ์•„์˜ˆ ๊ธ€์ž๊ฐ€ ๋ฐ”๊นฅ์œผ๋กœ ๋‚˜๊ฐ€๋ฒ„๋ฆฌ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์–ด.

 

โœ… ๊ทธ๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜ค๊ณ  ๋‚œ ํ›„, ์ด์ œ๋Š” ํ™”๋ฉด์— ๋ณด์—ฌ์งˆ๋•Œ ์–ด๋–ค ์•ก์…˜์„ ์ทจํ•˜๋Š”์ง€ ๋ณผ๊นŒ?

    private func showAnimation() {
        nameLabelCenterX.constant = 0
        bountyLabelCenterX.constant = 0
        
        /* ๊ฐ€์žฅ ๊ฐ„๋žตํ•œ
        UIView.animate(withDuration: 0.3) { // 0.3์ดˆ๋™์•ˆ
            self.view.layoutIfNeeded() // ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ ํ•ด๋ผ   
        }*/
        
        /* ์กฐ๊ธˆ ๋” ์Šคํƒ ๋‹ค๋“œํ•œ
        UIView.animate(withDuration: 0.3,
                       delay: 0.1,
                       options: .curveEaseIn,
                       animations : {
            self.view.layoutIfNeeded()
        }, completion: nil)
        */
        
        // ๊ธ€์ž๊ฐ€ ์Šคํ”„๋ง์ฒ˜๋Ÿผ ํŠ•๊ธฐ๋Š” ์ฝ”๋“œ
        UIView.animate(withDuration: 0.5, delay: 0.2, usingSpringWithDamping: 0.6, initialSpringVelocity: 2, options: .allowUserInteraction, animations: self.view.layoutIfNeeded, completion: nil)
         
        
        // ์นด๋“œ๊ฐ€ ๋Œ์•„๊ฐ
        UIView.transition(with: imgView, duration: 0.3, options: .transitionFlipFromLeft, animations: nil, completion: nil)
 
    }

์ฃผ๋ชฉํ• ๋งŒํ•œ ์ ์œผ๋กœ๋Š” ๊ฐ ๋ ˆ์ด๋ธ” ์ œ์•ฝ์กฐ๊ฑด์„ constant = 0๋กœ ๋ฐ”๊พผ๋‹ค๋Š” ์ ์ด์•ผ. 

์ด๊ฒŒ ์–ด๋–ค ์˜๋ฏธ์ด๋ƒ๋ฉด, ๊ธฐ์กด์— ์„ค์ •๋˜์–ด ์žˆ๋Š” ์ œ์•ฝ์กฐ๊ฑด์œผ๋กœ ๋Œ๋ ค๋†“๋Š” ๋‹ค๋Š” ๋ง์ด์•ผ

 - self.view.layoutIfNeeded() : ๋ ˆ์ด์•„์›ƒ์„ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉด ์กฐ์ •ํ•ด๋ผ.

๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ๊ทธ๋ƒฅ ๋”ฑ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๊ฐˆ๊ฑฐ๋‹ˆ๊นŒ ์‘์šฉํ•ด ๋ณด๊ธฐ ๋ฐ”๋ผ.

 

https://github.com/lgvv/fastCampus/tree/main/BountyList%20-%20Collection%2BAnimate

 

lgvv/fastCampus

Contribute to lgvv/fastCampus development by creating an account on GitHub.

github.com

 

 

----------------------------------------------------------------------------------------------------------------------

โœ…  ์—ฌ๊ธฐ๋ถ€ํ„ด ๋ทฐ์˜ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ดํŠธ!

 

์—ฌ๊ธฐ๋„ ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ viewDidLoad์™€ viewDidAppear ๋ถ€๋ถ„์„ ๋˜‘๊ฐ™์•„.

ํ•˜.์ง€.๋งŒ!!

 

โœ…  ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์™”์„๋•Œ ์กฐ๊ธˆ์€ ๋‹ค๋ฅด๊ฒŒ ์ฝ”๋”ฉํ•ด์•ผํ•ด 

    private func prepareAnimation() {
        nameLabel.transform = CGAffineTransform(translationX: view.bounds.width, y: 0).scaledBy(x: 3, y: 3).rotated(by: 180) // ์œ„์น˜์ด๋™ - ์Šค์ผ€์ผ์€ 3๋ฐฐ - ํšŒ์ „์€ 180๋„
        bountyLabel.transform = CGAffineTransform(translationX: view.bounds.width, y: 0).scaledBy(x: 3, y: 3).rotated(by: 180) // ์œ„์น˜์ด๋™ - ์Šค์ผ€์ผ์€ 3๋ฐฐ - ํšŒ์ „์€ 180๋„
    
        nameLabel.alpha = 0
        bountyLabel.alpha = 0
    }

์‚ฌ์ „์ค€๋น„ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ.

๊ฐœ๋…ํŽธ์—์„œ ๋ณด์•˜๋‹ค ์‹ถ์ด transform์„ ์ด์šฉํ• ๊ฑฐ์•ผ.

CGAffineTransform์„ ์ด์šฉํ•ด์„œ 

translation(์ด๋™)์„ ํ™œ์šฉํ•ด์„œ ์œ„์น˜๋ฅผ y์ถ•์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  x์ถ•์„ ๋ณ€๊ฒฝํ•ด์„œ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋‚ด๋ณด๋‚ด

scaledBy(ํ™•๋Œ€)๋ฅผ ์ด์šฉํ•ด์„œ x์™€y ๊ฐ’์„ 3๋ฐฐ ํฌ๊ฒŒ ๋งŒ๋“  ํ›„์—

rotated(ํšŒ์ „)์„ ์ด์šฉํ•ด์„œ 180๋„ ํšŒ์ „์„ ๋งŒ๋“ค์–ด.

๊ทธ ๋‹ค์Œ์— alpha ๊ฐ’์„ ์ฃผ์–ด์„œ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๊ฒŒ ์ดˆ๊ธฐ ์ž‘์—…์ด์•ผ.

 

 

โœ… ๊ทธ๋Ÿผ ์ด์ œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ธฐ ์ „์— ์–ด๋– ํ•œ ์•ก์…˜์„ ์ทจํ•˜๋Š”์ง€ ๋ณผ๊นŒ?

    private func showAnimation() {
        
        UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 2, options: .allowUserInteraction, animations: {
            self.nameLabel.transform = CGAffineTransform.identity // ๋ณ€ํ˜•์ด ์—†๋Š” ๋ชจ์Šต์˜ ์ •๋ณด๋กœ
            self.nameLabel.alpha = 1
        }, completion: nil)
        
        UIView.animate(withDuration: 1, delay: 0.2, usingSpringWithDamping: 0.6, initialSpringVelocity: 2, options: .allowUserInteraction, animations: {
            self.bountyLabel.transform = CGAffineTransform.identity
            self.bountyLabel.alpha = 1
        }, completion: nil)
        
        UIView.transition(with: imgView, duration: 0.3, options: .transitionFlipFromLeft, animations: nil, completion: nil)

    }

UIView API๋ฅผ ์ด์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค„๊ฑด๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฝ์–ด๋ณด๋ฉด ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„๊ฑฐ์•ผ.

๋ช‡๊ฐ€์ง€ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ ์€ 

1. ์• ๋‹ˆ๋ฉ”์ดํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ฐ๊ฐ์˜ ๋ ˆ์ด๋ธ”์— ๋‹ค๋ฅธ ํšจ๊ณผ๋ฅผ ์ฃผ์–ด์„œ ๋” ์™„์„ฑ๋„ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

2. CGAffineTransform.identity : ์ฒ˜์Œ์— ๋ณ€ํ˜•์ด ์—†๋Š” ๋ชจ์Šต์˜ ์ •๋ณด๋กœ

 

https://github.com/lgvv/fastCampus/tree/main/BountyList%20-%20Collection%20%2B%20Animate2

 

lgvv/fastCampus

Contribute to lgvv/fastCampus development by creating an account on GitHub.

github.com

 

 

 

 

 

์ฐธ๊ณ  

 - https://baked-corn.tistory.com/105

Comments