2016-02-14 2 views
10

По умолчанию, если вы перетаскиваете правую сторону от левого края экрана, он перетащит ViewController и вытащит его из стека.Как я могу реализовать «перетащить право, чтобы убрать» контроллер просмотра, находящийся в стеке навигации?

Я хочу расширить эту функциональность до всего экрана. Когда пользователь тянет куда угодно, я бы хотел, чтобы это произошло.

Я знаю, что я могу реализовать салфетки правильного жест и просто вызвать self.navigationController?.popViewControllerAnimated(true)

Однако, нет «перетаскивания» движения. Я хочу, чтобы пользователь мог правильно перетащить контроллер вида, как будто это объект, который показывает, что находится внизу. И, если его перетащили за 50%, отпустите его. (Проверьте Instagram, чтобы увидеть, что я имею в виду.)

+0

Я думаю, что это будет полезно для вас https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScreenEdgePanGestureRecognizer_class/index.html#//apple_ref/occ/cl/UIScreenEdgePanGestureRecognizer – ColdSteel

+0

Неужели Instagram уволит его за 33%? Я просто попытался, но мне кажется, что 50% отклоняют мнение. – Blaszard

+0

@Blaszard только что обновлен. – TIMEX

ответ

16

enter image description here

Сделано демонстрационный проект в Github
https://github.com/rishi420/SwipeRightToPopController

I Используется протокол UIViewControllerAnimatedTransitioning

Из документа:

// Это используется для процентов управляемых интерактивных переходов, а также для контроллеров контейнеров ...

Добавлен UIPanGestureRecognizer с точкой зрения контроллера. Это действие жеста:

func handlePanGesture(panGesture: UIPanGestureRecognizer) { 

    let percent = max(panGesture.translationInView(view).x, 0)/view.frame.width 

    switch panGesture.state { 

    case .Began: 
     navigationController?.delegate = self 
     navigationController?.popViewControllerAnimated(true) 

    case .Changed: 
     percentDrivenInteractiveTransition.updateInteractiveTransition(percent) 

    case .Ended: 
     let velocity = panGesture.velocityInView(view).x 

     // Continue if drag more than 50% of screen width or velocity is higher than 1000 
     if percent > 0.5 || velocity > 1000 { 
      percentDrivenInteractiveTransition.finishInteractiveTransition() 
     } else { 
      percentDrivenInteractiveTransition.cancelInteractiveTransition() 
     } 

    case .Cancelled, .Failed: 
     percentDrivenInteractiveTransition.cancelInteractiveTransition() 

    default: 
     break 
    } 
} 

шаги:

  1. Вычислить процент сопротивления на представлении
  2. .Begin: Укажите непосредственно перейти для выполнения и назначить UINavigationController делегата.Делегат будут необходимы для InteractiveTransitioning
  3. .Changed: UpdateInteractiveTransition с процентом
  4. .Ended: Продолжить остальные переходят, если сопротивление 50% или более или выше скорости еще отменить
  5. .Cancelled, .Failed: отменить переход


Ссылки:

  1. UIPercentDrivenInteractiveTransition
  2. https://github.com/visnup/swipe-left
  3. https://github.com/robertmryan/ScreenEdgeGestureNavigationController
  4. https://github.com/groomsy/custom-navigation-animation-transition-demo
+0

Есть ли способ сделать это без необходимости воссоздавать поп-по умолчанию по умолчанию, о котором вы знаете? –

+0

Шаг 2 'case .Begin:' где вы указываете 'segue'. это может быть любой выбор по вашему выбору. –

+0

Это не то, что я имел в виду. В вашем примере проекта вы создаете класс «SlideAnimatedTransitioning», который имитирует анимацию перехода по умолчанию, не так ли? Мне было интересно, могу ли я просто использовать анимацию по умолчанию, вместо того, чтобы имитировать ее ... –

-1

Вы можете использовать салфетки правильный жест для этой цели:

override func viewDidLoad() { 
    super.viewDidLoad() 

    var swipeRight = UISwipeGestureRecognizer(target: self, action: "popViewController:") 
    swipeRight.direction = UISwipeGestureRecognizerDirection.Right 
    self.view.addGestureRecognizer(swipeRight) 
} 


func popViewController(gesture: UIGestureRecognizer) { 

    if let swipeGesture = gesture as? UISwipeGestureRecognizer { 
     switch swipeGesture.direction { 
      case UISwipeGestureRecognizerDirection.Right: 
       self.navigationController.popViewControllerAnimated(true) 
      default: 
       break 
     } 
    } 
} 
Смежные вопросы