2016-04-29 1 views
4

Je crois que je trouve une solution, mais il est en Obj-C et je suis tout à fait nouveau & confus dans l'interprétation de ce à Swift: Horizontal UISwipeGestureRecognizer in subview of UIScrollView ? (UIScrollView only needs to recognize vertical scrolling)Swift - UISwipeGestureRecognizer Dans UIScrollView

J'ai mon Main.storyboard qui ajoute deux sous vues où je peux faire défiler horizontalement entre eux. Actuellement, les balayages haut et bas sont détectés mais pas la gauche et la droite en raison de l'UIScrollView. Une solution de contournement de cette interférence?

Main.storyboard:

// Global 
let vc0 = ViewController0(nibName: "ViewController0", bundle: nil) 
let vc1 = ViewController1(nibName: "ViewController1", bundle: nil) 

class ViewController: UIViewController, UIScrollViewDelegate, UIGestureRecognizerDelegate { 

@IBOutlet weak var scrollView: UIScrollView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.addChildViewController(vc0) 
    self.scrollView.addSubview(vc0.view) 
    vc0.didMoveToParentViewController(self) 

    var frame1 = vc1.view.frame 
    frame1.origin.x = self.view.frame.size.width 
    vc1.view.frame = frame1 

    self.addChildViewController(vc1) 
    self.scrollView.addSubview(vc1.view) 
    vc1.didMoveToParentViewController(self) 

    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width * 2, self.view.frame.size.height - 66) 
    self.scrollView.delegate = self 

    // Swipe Gesture Recognizers 
    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
    swipeRight.direction = UISwipeGestureRecognizerDirection.Right 
    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
    swipeLeft.direction = UISwipeGestureRecognizerDirection.Left 
    let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
    swipeUp.direction = UISwipeGestureRecognizerDirection.Up 
    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
    swipeDown.direction = UISwipeGestureRecognizerDirection.Down 

    swipeRight.delegate = self 
    swipeLeft.delegate = self 

    self.view.addGestureRecognizer(swipeRight) 
    self.view.addGestureRecognizer(swipeLeft) 
    self.view.addGestureRecognizer(swipeUp) 
    self.view.addGestureRecognizer(swipeDown) 
} 

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 
    return true 
} 

// Debugging - Only Up & Down Swipes Are Detected 
func respondToSwipeGesture(gesture: UIGestureRecognizer) { 
    if let swipeGesture = gesture as? UISwipeGestureRecognizer { 
     switch swipeGesture.direction { 
     case UISwipeGestureRecognizerDirection.Right: 
      print("Swiped right") 
     case UISwipeGestureRecognizerDirection.Down: 
      print("Swiped down") 
     case UISwipeGestureRecognizerDirection.Left: 
      print("Swiped left") 
     case UISwipeGestureRecognizerDirection.Up: 
      print("Swiped up") 
     default: 
      break 
     } 
    } 
} 
} 

Répondre

8

Je pense que vous avez besoin de mettre en œuvre le protocole UIGestureRecognizerDelegate

Est-ce que réaliser ce que vous cherchez?

import UIKit 

class ViewController: UIViewController, UIScrollViewDelegate, UIGestureRecognizerDelegate { 

    @IBOutlet weak var scrollView: UIScrollView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // these were made in a storyboard I whipped up for this example. 
     let vc0 = self.storyboard!.instantiateViewControllerWithIdentifier("vc0") 
     let vc1 = self.storyboard!.instantiateViewControllerWithIdentifier("vc1") 

     self.addChildViewController(vc0) 
     self.scrollView.addSubview(vc0.view) 
     vc0.didMoveToParentViewController(self) 

     var frame1 = vc1.view.frame 
     frame1.origin.x = self.view.frame.size.width 
     vc1.view.frame = frame1 

     self.addChildViewController(vc1) 
     self.scrollView.addSubview(vc1.view) 
     vc1.didMoveToParentViewController(self) 

     self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width * 2, self.view.frame.size.height - 66) 
     self.scrollView.delegate = self 

     // Swipe Gesture Recognizers 
     // These can be lets because they aren't mutated and I'm using the latest Selector syntax 
     let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
     swipeRight.direction = UISwipeGestureRecognizerDirection.Right 
     let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
     swipeLeft.direction = UISwipeGestureRecognizerDirection.Left 
     let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
     swipeUp.direction = UISwipeGestureRecognizerDirection.Up 
     let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:))) 
     swipeDown.direction = UISwipeGestureRecognizerDirection.Down 

     // ViewController will be the delegate for the left and right swipes 
     swipeRight.delegate = self 
     swipeLeft.delegate = self 

     self.view.addGestureRecognizer(swipeRight) 
     self.view.addGestureRecognizer(swipeLeft) 
     self.view.addGestureRecognizer(swipeUp) 
     self.view.addGestureRecognizer(swipeDown) 
    } 

    // here are those protocol methods with Swift syntax 
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 
     return true 
    } 

    // Debugging - All Swipes Are Detected Now 
    func respondToSwipeGesture(gesture: UIGestureRecognizer) { 
     if let swipeGesture = gesture as? UISwipeGestureRecognizer { 
      switch swipeGesture.direction { 
      case UISwipeGestureRecognizerDirection.Right: 
       print("Swiped right") 
      case UISwipeGestureRecognizerDirection.Down: 
       print("Swiped down") 
      case UISwipeGestureRecognizerDirection.Left: 
       print("Swiped left") 
      case UISwipeGestureRecognizerDirection.Up: 
       print("Swiped up") 
      default: 
       break 
      } 
     } 
    } 
} 
+0

Ah darn! J'ai oublié d'inclure mes variables vc0 et vc1 dans mon code. Ils sont placés globalement. Maintenant mis à jour. J'ai essayé votre code sans la façon dont vous avez initialisé vc0 & vc1 et il se bloque. Hmmm ... – theflarenet

+0

Quelle version de Swift et Xcode utilisez-vous? Aussi, quel est le crash? –

+0

J'utilise la dernière version de Swift et xCode. Désolé de ne pas être précis. Il se bloque à droite quand je commence à glisser vers vc0: 'Terminer l'application en raison d'exception non interceptée 'NSInvalidArgumentException', raison: '- [Project.ViewController respondToSwipeGesture:]: sélecteur non reconnu envoyé à l'instance 0x7be75360'' – theflarenet