     viewController.view.addGestureRecognizer(pan)
   }
   
-  func handlePanGesture(gesture: UIPanGestureRecognizer){
-    
+  func handlePanGesture(panGesture: UIPanGestureRecognizer){
+    var progress = panGesture.translation(in: self.view).x / self.view.frame.width
+    progress = min(1, max(0, progress))
+    switch panGesture.state {
+    case .began:
+      self.interactivePopTransition = UIPercentDrivenInteractiveTransition()
+      self.popViewController(animated: true)
+    case .changed:
+      self.interactivePopTransition?.update(progress)
+    case .ended, .cancelled:
+      if progress > 0.1 {
+        self.interactivePopTransition?.finish()
+      }else{
+        self.interactivePopTransition?.cancel()
+      }
+      self.interactivePopTransition = nil
+    default:
+      break
+    }
   }
 }

  }
  
  //optional. delegate가 VC의 transition동안 사용 할 noninteractive animator object를 return하게 하기 위해 호출 됩니다.
  func navigationController(_ navigationController: UINavigationController,
                            animationControllerFor operation: UINavigationControllerOperation,
                            from fromVC: UIViewController,

  }
  
  //optional. delegate가 VC의 transition동안 사용 할 interactive animator object를 return하게 하기 위해 호출 됩니다.
  //네비게이션 스택에 추가되거나 네비게이션 스택에서 제거 될 때 뷰 컨트롤러간에 custom interactive transition을 제공하고자 할 때 이 델리게이트 메소드를 구현한다.
  //반환하는 객체는 transition의 상호 작용 측면을 구성해야하며 animationController 매개 변수의 객체로 작업하여 애니메이션을 시작해야합니다.
  func navigationController(_ navigationController: UINavigationController,
                            interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
    if animationController.isKind(of: SlippingPopTransition.self) {
