본문 바로가기
iOS/설명

[iOS] UIViewPropertyAnimator

by Sky Titan 2022. 5. 15.
728x90
 

[iOS - swift] 1. UIViewPropertyAnimator, AnimationStates - 개념

1. UIViewPropertyAnimator, AnimationStates - 개념 2. UIViewPropertyAnimator, AnimationStates - fractionComplete, interactive animation (상호작용 애니메이션) UIViewPropertyAnimator UIView.animate와..

ios-development.tistory.com

 

 

Apple Developer Documentation

 

developer.apple.com

UIViewPropertyAnimator

  • view들의 변화들을 animation으로 처리하고, 해당 animation들의 동적인 변화들을 처리하는 클래스
  • UIView.animate와 역할이 거의 비슷하나, animation들의 실행하고 일시정지, 중지, 타이밍들을 처리할 수 있다는 차이점이 있다.
  • animatable한 property들의 값을 조절해서 animation을 실행할 수 있다.
    • frame
    • center
    • alpha
    • transform
  • fractionComplete: animatior의 현재 progress의 percentage를 0~1 사이의 값
    • 해당 값을 수정해서 animation의 진행 상태를 수정할 수 있다.

 

UIViewAnimating

  • 커스텀 animator 객체를 구현할 수 있는 protocol이다.
  • animation을 위한 기본 flow control을 구현하는 메소드들을 정의한 프로토콜이다.
  • 현재 animation의 상태를 나타내는 몇 가지 프로퍼티들을 가지고 있다.
  • 보통 UIViewPropertyAnimator와 관련된 animation들을 다룰 때 이 프로토콜의 메소드들을 사용한다.
    • animation을 시작, 정지 혹은 거꾸로 재생, 완료 상태 변경 등과 같은 작업

 

animator 객체의 상태 변경

  • 총 3가지 상태가 존재한다.
    • Inactive
    • Active
    • Stopped
  • 새로 생성된 animator객체는 Inactive상태로 세팅되어 있다.
    • startAnimation() 혹은 pauseAnimation()을 호출하면 Active상태로 변경된다.
    • stopAnimation()을 호출하게 되면 Stopped상태(혹은 Inactive)로 변경된다.
      • animation을 종료하되, property animator를 최종값이 아닌, stop한 시점의 값으로 유지시킨채 종료시킨다.
      • Inactive상태에서 호출하면 그대로 Inactive상태를 유지한다.
    • finishAnimation(at:)을 누르게 되면 Inactive상태로 바뀌면서 animation이 종료된다.
      • 반드시 stop상태에 있을 때 호출해야 하며, active 혹은 Inactive상태일 때 호출하면 크래시 발생
    • animation이 완전히 종료되면 Inactive 상태로 돌아간다.
//
//  ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var redView: UIView!
    lazy var animator = UIViewPropertyAnimator(duration: 3, curve: .linear, animations: { [weak self] in
        guard let strongSelf = self else { return }
        strongSelf.redView.transform = .init(scaleX: 0.5, y: 0.5)
        
    })
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    @IBAction func start(_ sender: Any) {
    	// active로 변경
        animator.startAnimation()
        print(animator.state.string())
    }
    @IBAction func pause(_ sender: Any) {
    	// active 상태 유지
        animator.pauseAnimation()
        print(animator.state.string())
        print(animator.fractionComplete)
    }
    @IBAction func stop(_ sender: Any) {
    	// stop으로 변경
        animator.stopAnimation(false)
        print(animator.state.string())
        print(animator.fractionComplete)
    }
    @IBAction func finish(_ sender: Any) {
    	// Inactive로 변경
        animator.finishAnimation(at: .start)
        print(animator.state.string())
        print(animator.fractionComplete) //현재 상태
    }
}

extension UIViewAnimatingState {
    func string() -> String {
        switch self {
        case .active:
            return "active"
        case .inactive:
            return "inactive"
        case .stopped:
            return "stopped"
        }
    }
}

 

728x90

'iOS > 설명' 카테고리의 다른 글

[iOS] Rest API 테스트 사이트  (0) 2022.05.21
[iOS] URLSession  (0) 2022.05.16
[iOS] Push Notification callback함수들  (1) 2022.04.24
[iOS] UIView.transition  (0) 2022.04.24
[iOS] performBatchUpdates  (0) 2022.04.24

댓글