ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CoreAnimation] Ch19. Interactive UINavigationController Transitions
    Ray Wenderlich/Core Animation 2018. 12. 15. 21:06

    19장 Interactive UINavigationController Transitions 

    Intro

    사용자의 행동에 반응하는 트랜지션을 구현해보자. 

    Pan제스쳐를 활용할 예정이다. 


    Creating an interactive transition

    트랜지션이 발생할 때, UINavigationController는 delegate에 애니메이션 컨트롤러가 있는지 물어본다. 

    이건 이미 알고 있던 것 하지만 추가로 interactive controller도 있는지 물어본다! 


    AnimationController와 Interactive Controller는 하나의 클래스로 구현하는 것이 편하다. 

    UIViewControllerAnimatedTransitioning, UIViewControllerInteractiveTransitioning을 동시에 구현해주면 됨 


    UIViewControllerInteractiveTransitioning에는 required메소드가 1개 있다. 

    startInteractiveTransition(_: ) 

    그리고 updateInteractiveTransition(_:) 를 계속 호출하면서 트랜지션의 진행정도를 조절해준다. 


    Handling the pan gesture 

    tap제스쳐와는 달리 pan제스쳐는 start, progress, end point를 나눌 수 있다. 

    메인화면의 tap제스쳐를 제거하고 pan제스쳐를 추가해보자. 


    Using interactive animator classes 

    UIPercentDrivenInteractiveTransition  (애플에서 기본 제공하는 interactive animator. Protocol이 아닌 Class이다. )

    UIPanGestureRecognizerstate프로퍼티를 활용하여 유저가 슬라이드 하는 시점을 캐치할 수 있다. 


    Calculating your animation’s progress 

    UIPanGestureRecognizertranslation(in:)을 사용하면 사용자가 드래그한 거리를 알 수 있다. 

    이 값을 통해 progress를 결정해준 뒤, UIPercentDrivenInteractiveTransitionupdate()를 호출하자. 

    UIPercentDrivenInteractiveTransition는 layer animation에는 작동하지 않는다. 이를 해결하기 위해 

    - animation container view의 layer의 모든 layer animation을 중지 시킨다. 

    - 그리고 layer의 timeOffset을 조정하여 애니메이션이 되는 것처럼 보여준다. 

    CALayer에 이러한 cheating을 한 것이 UIKit의 버그 때문이라고 생각할수도 있겠으나, 내부적으로도 이러한 방법으로 Interactive transition이 구현 되고 있다. 


    Handling early termination 

    사용자가 percent를 100으로 채우기 전에 손가락을 뗏다면? 트랜지션이 도중에 중단되는 참사가 발생 

    UIPercentDrivenInteractiveTransition에서는 도중에 멈춘 트랜지션을 완료시킬것인지?(finish()) 아니면 취소하고 원래로 되돌릴 것인지?(cancel())를 수행할 수 있는 메소드가 있다. 

    CALayer의 speed를 -1로 설정하면 애니메이션을 거꾸로한다. 


    Challenge 

    Pop제스쳐도 interactive하게 만들기 

    interactive pop을 하지 않으려면 (Back버튼으로 뒤로가기) interactive controller를 nil로 리턴해주어야 한다. 


    메모 

    Finally, you cap the progress variable between 0.01 and 0.99; 

    my testing shows that interaction controllers behave better if you don’t let the user finish or revert the transition from the pan gesture alone. 

    interactive의 progress에 1-99%의 값을 주도록하자. 팬제스쳐만으로 finish또는 revert되도록하는것보다 1-99정도의 값만 갖는게 더 잘 동작한다.

Designed by Tistory.