본문 바로가기

iOS 개발/UIKit

[iOS/UIKit] Animation 효과로 ViewController 전환하기

ViewController 전환을 Animate 시킬 때 생각해야 할 것 ?

Animation 을 통해 ViewController 를 전환하려는 목적을 잘 생각해보자. 많은 경우에, 전환되는 화면들의 관계성을 사용자가 잘 이해하도록 보여주기 위함이다.

 

예를 들어, 아이폰의 달력 앱에서 열두 달이 놓여 있을 때 특정 달을 누르면 전체 화면이 해당 달 위치로 좁혀 들어가며 해당 달의 날짜들이 확대되어 보이는 화면으로 전환된다. 이런 방식의 화면 전환은 사용자가 한 해의 전체 달 중 어떤 특정한 달의 정보를 얻기 위해 이동했다는 가시적인 이해를 제공하여 앱을 사용하는 어떤 목적과 과정에 대해 현재 어느 부분에 위치해 있다는 느낌을 줄 수 있다.

View 전환을 준비하기 위한 질문들

어떤 View 가 Animate 되어야 하는가?

어떤 Property 가 Animate 되어야 하는가?

Animation 을 위한 시작값과 종료값이 어떻게 되는가?

Animate 와 함께 View 전환하기

전환을 실행할 View Controller 에서 UIViewControllerTransitioningDelegate 를 채택한다.

 

ension ViewController: UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // 전환될 화면을 띄울 때의 Animation 동작을 정의한 객체를 반환한다.
        return popUpAnimator
    }
    
    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // 전환된 화면을 띄운 후 다시 닫을 때의 Animation 동작을 정의한 객체를 반환한다.
        return popDownAnimator
    }
}
 

 

전환을 위한 Animation Class 를 정의한다.

 

extension PopUpAnimator: UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        // Animation을 지속할 시간을 반환한다.
    }
    
    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        // Animation 동작을 정의한다.
    }
}
 

 

Presenting 과 Dismissing 이 같은 동작을 반대로 실행하는 경우 하나의 Animation Class 에서 화면을 띄우는지 닫는지 확인하는 Bool 타입 flag 변수를 두고 이 변수의 상태에 따라 삼항 연산자로 전환을 설정하면 편하다.