728x90
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을 시작, 정지 혹은 거꾸로 재생, 완료 상태 변경 등과 같은 작업
- 총 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 |
댓글