ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS] ChainAnimation
    Programming/iOS 2020. 3. 7. 16:39

    View 를 탭했을때, UILabel 에 Chain Animation 적용해보자.

    viewDidLoad 에서 UILabel의 레이아웃을 잡고,  현재 view 에 탭제스쳐를 붙인다.

        override func viewDidLoad() {
            super.viewDidLoad()
            
            setupLabels()
            setupStackView()
            
            //animations
            view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTapAnimation)))
        }

     

    handleTapAnimation 코드

    		// Animation - titleLabel
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
                self.titleLabel.transform = CGAffineTransform(translationX: -30, y: 0)
            }) { (_) in
                //2 animation
                UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                    self.titleLabel.alpha = 0
                    self.titleLabel.transform = self.titleLabel.transform.translatedBy(x: 0, y: -200)
                })
            }
            
             //Animation - bodyLabel
            UIView.animate(withDuration: 0.5, delay: 0.5, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
                self.bodyLabel.transform = CGAffineTransform(translationX: -30, y: 0)
            }) { (_) in
                UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                    self.bodyLabel.alpha = 0
                    self.bodyLabel.transform = self.bodyLabel.transform.translatedBy(x: 0, y: -200)
                })
            }

    리펙토링

        fileprivate func handleAnimateLabel(delay: TimeInterval, startAnimation: @escaping ()->Void, _ endAnimation: ((Bool)->Void)? = nil){
            UIView.animate(withDuration: 0.7, delay: delay, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5, options: .curveEaseIn, animations: startAnimation, completion: endAnimation)
        }
        
        fileprivate func animation_start(label: UILabel) -> () -> Void{
            { label.transform = CGAffineTransform(translationX: -30, y: 0) }
        }
        
        fileprivate func animation_end(label: UILabel) -> Void{
            label.alpha = 0
            label.transform = self.titleLabel.transform.translatedBy(x: 0, y: -200)
        }
        
        @objc fileprivate func handleTapAnimation(){
            // titleLabel animation
            handleAnimateLabel(delay: 0, startAnimation: animation_start(label: titleLabel)) { (_) in
                self.handleAnimateLabel(delay: 0, startAnimation: {
                    self.animation_end(label: self.titleLabel)
                })
            }
            
            // bodyLabel animation
            handleAnimateLabel(delay: 0.5, startAnimation: animation_start(label: bodyLabel)) { (_) in
                self.handleAnimateLabel(delay: 0, startAnimation: {
                    self.animation_end(label: self.bodyLabel)
                })
            }
         }

     

     

     

    댓글

Designed by Tistory.