2016-02-14 12 views
10

Domyślnie, jeśli przeciągniesz prawo z lewej krawędzi ekranu, przeciągniesz ViewController i zdejmiesz go ze stosu.Jak mogę zaimplementować "przeciągnij w prawo, aby odrzucić" kontroler widoku znajdujący się w stosie nawigacyjnym?

Chcę rozszerzyć tę funkcjonalność na cały ekran. Gdy użytkownik naciśnie w dowolnym miejscu, chciałbym, aby to samo się wydarzyło.

wiem, że mogę wdrożyć właściwą gest machnięcia i po prostu zadzwonić self.navigationController?.popViewControllerAnimated(true)

Jednak nie ma „przeciąganie” ruch. Chcę, aby użytkownik mógł przeciągać kontroler widoku prawym ruchem tak, jakby był obiektem, ujawniając to, co jest pod spodem. A jeśli przeciągnie się o 50%, odrzuć go. (Sprawdź Instagram, aby zobaczyć, co mam na myśli).

+0

myślę, że to byłoby pomocne dla Ciebie https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScreenEdgePanGestureRecognizer_class/index.html#//apple_ref/occ/cl/UIScreenEdgePanGestureRecognizer – ColdSteel

+0

Czy Instagram odrzucił go o 33%? Po prostu próbowałem, ale wydaje mi się, że odrzucenie tego poglądu wynosi 50%. – Blaszard

+0

@Blaszard właśnie zaktualizowany. – TIMEX

Odpowiedz

16

enter image description here

Wykonany projekt demo w Github
https://github.com/rishi420/SwipeRightToPopController

I 've used UIViewControllerAnimatedTransitioning protocol

Z dokumentu:

// Służy do przejścia procent napędzany interaktywnych, jak również dla kontrolerów kontenerowych ...

dodał UIPanGestureRecognizer do widoku kontrolera. Jest to działanie gest:

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 
    } 
} 

kroki:

  1. Obliczyć procent przeciągnij na widoku
  2. .Begin: Określ segue do wykonywania i przypisać UINavigationController delegata.pełnomocnika będą potrzebne InteractiveTransitioning
  3. .Changed: UpdateInteractiveTransition z procentem
  4. .Ended: dalej pozostałe przejście jeżeli przeciągania 50% lub więcej wyższa prędkość jeszcze zrezygnować
  5. .Cancelled, .Failed: zrezygnować przejście


Literatura:

  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

Czy jest jakiś sposób, aby to zrobić bez konieczności ponownego tworzenia domyślnego przejścia na pop, o którym wiesz? –

+0

Krok 2 'case .Begin:' gdzie określasz 'segue'. może to być dowolna pora twojego wyboru. –

+0

Nie o to mi chodziło. W twoim przykładowym projekcie tworzysz klasę "SlideAnimatedTransitioning", która naśladuje domyślną animację przejścia, prawda? Zastanawiałem się, czy mogę po prostu użyć domyślnej animacji, zamiast naśladować to ... –

-1

Można użyć przesunięcie w prawo gestu do tego celu:

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 
     } 
    } 
} 
Powiązane problemy