2016-04-29 9 views
4

Ich glaube, ich eine Lösung gefunden, aber es ist in Obj-C und ich bin völlig neue & verwirrt in diese in Swift Interpretation: Horizontal UISwipeGestureRecognizer in subview of UIScrollView ? (UIScrollView only needs to recognize vertical scrolling)Swift - UISwipeGestureRecognizer Innerhalb UIScrollView

Ich habe meine Main.storyboard die zwei Unter fügt Ansichten, wo ich horizontal zwischen ihnen scrollen kann. Momentan werden Auf- und Abwischen erkannt, jedoch nicht die linke und rechte Seite aufgrund der UIScrollView. Irgendwelche Workaround diese Störung?

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

Antwort

8

Ich glaube, Sie implementieren müssen Ist das UIGestureRecognizerDelegate Protokoll

dies zu erreichen, was Sie suchen?

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 verdammt! Ich habe vergessen, meine Variablen vc0 und vc1 in meinen Code aufzunehmen. Sie sind global platziert. Jetzt aktualisiert. Ich habe deinen Code ausprobiert, ohne dass du vc0 & vc1 initialisiert hast und es abstürzt. Hmmm ... – theflarenet

+0

Welche Version von Swift und Xcode verwenden Sie? Auch was ist der Absturz? –

+0

Ich verwende die neueste Version von Swift und xCode. Entschuldigung, dass ich nicht spezifisch bin. Es stürzt direkt ab, wenn ich anfange, zu vc0 zu wischen: 'App aufgrund der nicht abgefangenen Ausnahme beenden 'NSInvalidArgumentException', Grund: '- [Project.ViewController replyToSwipeGesture:]: nicht erkannter Selektor an Instanz 0x7be75360 gesendet' ' – theflarenet