
layoutIfNeeded()Standard Mission
- 지난 주 미션 결과물에 애니메이션 추가하기
- 2~3개 이상 추가해 주세요!
- 굳이 지난 주 프로젝트가 아니더라도 상관 없습니다 🙂
3주차에 만들었던 사칙연산 계산기 이미지에 애니메이션을 적용했다.
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapImageView))
imageView.addGestureRecognizer(tapGestureRecognizer)
}
viewDidLoad 에서 image view에 tap gesture recognizer를 등록한다. ⇒ image view의 User Interaction Enabled 속성을 체크해야 gesture recognizer가 정상적으로 실행된다! @objc func didTapImageView() {
UIView.animate(withDuration: 0.25) {
let scale = CGAffineTransform(scaleX: 0.9, y: 0.9)
self.imageView.transform = scale
} completion: { finished in
UIView.animate(withDuration: 0.25) {
self.imageView.transform = .identity
}
}
}
CGAffineTransform 을 사용해서 image view의 크기를 0.9배로 설정한다..identity : 애니메이션 동작이 끝나면 원래 상태로 돌아간다. override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
animateImageView()
}
func animateImageView() {
UIView.animate(withDuration: 2, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.3, options: .repeat) {
let translation = CGAffineTransform(translationX: 0, y: 10)
self.imageView.transform = translation
}
}
viewDidAppear 에서 애니메이션과 관련된 함수를 실행한다.viewDidLoad 에서 함수를 실행하면 애니메이션이 동작하지 않는다. viewDidAppear 또는 viewWillAppear 에서 함수를 실행해야 하는 것 같다.usingSpringWithDamping : 튕겨지는 정도 (0.0~1.0)initialSpringVelocity : 튕겨지는 속도 (0.0~1.0).repeat : 애니메이션을 반복하는 옵션CGAffineTransform 를 사용해서 image view의 y좌표 값을 변경한다.세미나에서는 layoutIfNeeded()를 반드시 호출해주어야 한다고 하셨는데, 내가 짠 코드에서는 layoutIfNeeded를 호출하지 않아도 애니메이션이 잘 동작했다.
CGAffineTransform 메소드는 auto layout의 constraint을 변경하는 것이 아니기 때문에 layoutIfNeeded를 호출하지 않아도 되는 것 같다.
그 외…