관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. UIViewPropertyAnimator, AnimationStates - fractionComplete, interactive animation (상호작용 애니메이션) 본문

iOS 응용 (swift)

[iOS - swift] 2. UIViewPropertyAnimator, AnimationStates - fractionComplete, interactive animation (상호작용 애니메이션)

jake-kim 2022. 5. 10. 22:15

1. UIViewPropertyAnimator, AnimationStates - 개념

2. UIViewPropertyAnimator, AnimationStates - fractionComplete, interactive animation (상호작용 애니메이션)

UIViewPropertyAnimator의 상태 (복습)

  • 새로 생성된 인스턴스는 inactive상태에서 시작
  • 애니메이션을 마친 인스턴스도 inactive 상태로 돌아감
  • startAnimation() 메서드를 호출하면 active 상태로 변경
  • 중지하면 stopped 상태로 변경

interactive animation (상호작용 애니메이션)

ex) viewDidAppear 메소드에서 애니메이션이 시작되고, 이 애니메이션은 3개의 뷰를 순차적으로 흐리게하는 애니메이션

- 이 애니메이션이 동작하고 있을때 UISlider를 통해서 애니메이션의 동작을 컨트롤할 수 있게 사용

  • 0~1값을 갖는 fractionComplete 프로퍼티를 사용하여 상호작용 애니메이션 구현이 가능
    • UISlider의 값을 fractionComplete 프로퍼티에 사용
  var animator: UIViewPropertyAnimator?
  
  private let slider: UISlider = {
    let slider = UISlider()
    slider.addTarget(self, action: #selector(didChangeSlide), for: .valueChanged)
    slider.translatesAutoresizingMaskIntoConstraints = false
    return slider
  }()
  
  @objc private func didChangeSlide() {
    self.animator?.fractionComplete = CGFloat(self.slider.value)
  }
  • viewDidLoad에서 애니메이션 정의
    • 생성자의 파라미터에서 animation의 duration 설정
    • addAnimations로 애니메이션 동작 정의
    • addCompletion으로 애니메이션이 끝난 경우 정의
    self.animator = UIViewPropertyAnimator(
      duration: 5,
      timingParameters: UICubicTimingParameters(animationCurve: .easeInOut)
    )
    
    self.animator?.addAnimations {
      UIView.animateKeyframes(
        withDuration: 0,
        delay: 0,
        animations: {
          UIView.addKeyframe(
            withRelativeStartTime: 0,
            relativeDuration: 0.3 / 1.0,
            animations: { self.redView.alpha = 0 }
          )
          UIView.addKeyframe(
            withRelativeStartTime: 0,
            relativeDuration: 0.6 / 1.0,
            animations: { self.greenView.alpha = 0 }
          )
          UIView.addKeyframe(
            withRelativeStartTime: 0.1 / 0.5,
            relativeDuration: 0.9 / 1.0,
            animations: { self.blueView.alpha = 0 }
          )
        }
      )
    }
    
    self.animator?.addCompletion { [weak self] _ in
      [self?.redView, self?.greenView, self?.blueView]
        .forEach { $0?.alpha = 1 }
    }
  • viewDidAppear에서 startAnimation() 호출
    • 애니메이션 동작
  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.animator?.startAnimation()
  }

* 전체 코드: https://github.com/JK0369/ExAnimator

* 참고

https://ios-development.tistory.com/922

https://jinnify.tistory.com/69

 

Comments