2016-06-04 11 views
1

ich für gehen zurück mit dem folgenden Code und vorwärts in meinem WebView mit UIScreenEdgePanGestureRecognizer:UIScreenEdgePanGestureRecognizer auslöst mehrmals

class FirstViewController: UIViewController { 

     @IBOutlet var homewebview: UIWebView! 

     // create left edge and right edge gesture 
     let leftEdgePanGesture = UIScreenEdgePanGestureRecognizer() 
     let rightEdgePanGesture = UIScreenEdgePanGestureRecognizer() 


     override func viewDidLoad() { 
      super.viewDidLoad() 

      // add target for gesture 
      self.leftEdgePanGesture.addTarget(self, action: #selector(FirstViewController.handleLeftEdge(_:))) 
      self.rightEdgePanGesture.addTarget(self, action: #selector(FirstViewController.handleRightEdge(_:))) 

      // set detection edge 
      self.leftEdgePanGesture.edges = UIRectEdge.Left 
      self.rightEdgePanGesture.edges = UIRectEdge.Right 

      // add gesture into view 
      self.view.addGestureRecognizer(self.leftEdgePanGesture) 
      self.view.addGestureRecognizer(self.rightEdgePanGesture) 
     } 
     func handleLeftEdge(gesture: UIScreenEdgePanGestureRecognizer) { 
      homewebview.goBack() 
     } 

     // perform operation when right edge gesture detected 
     func handleRightEdge(gesture: UIScreenEdgePanGestureRecognizer) { 
      homewebview.goForward() 
     } 
    } 

Mein Problem ist, dass es mehrere Male ist auslösen. Es geht nicht eine Seite vor/zurück, es geht zurück/vorwärts ca. 5 Webseiten.

Gibt es eine Lösung? Oder muss ich UISwipeGestureRecognizer verwenden. Ich möchte lieber nicht UISwipeGestureRecognizer verwenden, weil es nicht so zuverlässig reagiert wie UIScreenEdgePanGestureRecognizer. UISwipeGestureRecognizer manchmal "denkt" Ich möchte in meinem WebView vertikal blättern und reagiert nicht. Oder gibt es dafür eine Lösung?

Antwort

2

Der Pan-Gesten-Erkenner ruft die Handler-Methode jedes Mal auf, wenn sich der Status ändert. Das schließt ein, wenn es beginnt, endet und jede Bewegung dazwischen. Innerhalb des Handlers müssen Sie den Zustand des Gestenerkenners überprüfen und entscheiden, was zu tun ist.

Sie möchten Ihren Code nur einmal pro Geste auslösen, und Sie möchten es nur tun, wenn sich die Berührung um mehr als einen Schwellenwert bewegt hat.

class ViewController: UIViewController { 

    let leftEdgePanGesture = UIScreenEdgePanGestureRecognizer() 
    var leftPanTriggered: Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     leftEdgePanGesture.addTarget(self, action: #selector(handleLeftEdge(_:))) 
     leftEdgePanGesture.edges = .Left 
     view.addGestureRecognizer(leftEdgePanGesture) 
    } 

    func handleLeftEdge(gesture: UIScreenEdgePanGestureRecognizer) { 
     switch gesture.state { 
      case .Began, .Changed: 
       if !leftPanTriggered { 
        let threshold: CGFloat = 10 // you decide this 
        let translation = abs(gesture.translationInView(view).x) 
        if translation >= threshold { 
         performLeftGesture() 
         leftPanTriggered = true 
        } 
       } 

      case .Ended, .Failed, .Cancelled: 
       leftPanTriggered = false 

      default: break 
     } 
    } 

    func performLeftGesture() { 
     homewebview.goBack() 
    } 

} 
+0

Vielen Dank. Es funktioniert perfekt. Du bist unglaublich. –

+0

Hallo Kurt Revis, ich habe es für links und rechts hinzugefügt. Links funktioniert, aber rechts funktioniert nicht. Warum das? Soll ich den Code bereitstellen? –

+0

Wenn Sie nach rechts wischen, wäre die Übersetzung negativ. Verwenden Sie 'abs (gesten.translationInView (view) .x)', um den Schwellenwert zu vergleichen. Bearbeitete die Antwort. –