2016-08-15 2 views
4

Je suis en train de mettre en œuvre un outil de reconnaissance de mouvements pour balayer dans Swift. Je voulais pouvoir simuler le jet de la carte (glisser par programmation la vue).simuler par programme un mouvement de balayage dans swift

Je supposais qu'il y aurait une fonction intégrée pour cela, mais tout ce que j'ai trouvé est un pour le geste du robinet pas glisser geste.

Voilà comment je suis mise en œuvre du swipe gesticulant:

let gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:")) 
    cardView.addGestureRecognizer(gesture) 
    cardView.userInteractionEnabled = true 
} 

func wasDragged (gesture: UIPanGestureRecognizer) {   
    let translation = gesture.translationInView(self.view) 
    let cardView = gesture.view! 

    // Move the object depending on the drag position 
    cardView.center = CGPoint(x: self.view.bounds.width/2 + translation.x, 
           y: self.view.bounds.height/2 + translation.y) 
+0

La vue bouge-t-elle avec le code que vous avez actuellement? – NSGangster

+0

Donc, vous voulez faire ce que le geste de balayage fait par programmation? Pourquoi n'appelez-vous pas la même fonction à la fois dans le balayage et dans le manuel? Les décalages et les positions devraient également être réglés manuellement. – Imbue

+0

@NSGangster Oui, il se déplace et balaye bien. –

Répondre

-1

Vous devez implémenter UISwipeGestureRecognizer

override func viewDidLoad() { 
super.viewDidLoad() 

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

var swipeDown = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:") 
swipeDown.direction = UISwipeGestureRecognizerDirection.Down 
self.view.addGestureRecognizer(swipeDown) 

}

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

J'ai déjà le balayage.Je ne pouvais pas voir n'importe où dans ce que vous avez posté où il a simulé l'utilisateur glisser? Ai-je manqué quelque chose. –

1

Vous pouvez créer le UIPanGestureRecognizer par vous-même et laissez-passer à la méthode wasDragged. Vous devriez vérifier avec différentes valeurs de la traduction si:

let gesture = UIPanGestureRecognizer() 
gesture.setTranslation(CGPointMake(0, 100), inView: self.view) 
wasDragged(gesture) 

Bien que je suppose que vous avez besoin d'autre chose. Pourquoi avez-vous besoin de simuler ce geste en premier lieu?

+0

Ainsi quand ils frappent le bouton dans les flings la carte du pont. La même chose que l'amadou fait quand vous appuyez sur les boutons aiment ou n'aiment pas le fond au lieu de glisser. –

+1

Donc, vous savez exactement combien vous ne voulez pas donner à votre carte. Pourquoi ne pas l'appliquer directement aux cartes au lieu de créer un geste simulant ce niveau de balayage? –

+0

Je veux être en mesure de faire à la fois appuyer sur le bouton ou le film. Mais pour le bouton, la chose avec un coup il suit une courbe étrange pas sûr de savoir comment faire cela et pensé qu'il pourrait y avoir une méthode intégrée d'une certaine sorte. –

0

Pour SWIFT 3,0

let swipeRightOrange:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(slideToRightWithGestureRecognizer)) 
swipeRightOrange.direction = .Right; 

let swipeLeftOrange:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(slideToLeftWithGestureRecognizer)) 
swipeLeftOrange.direction = .Left; 

@IBAction func slideToLeftWithGestureRecognizer(gestureRecognizer:UISwipeGestureRecognizer) 
{ 
viewOrange.backgroundColor = UIColor.blue 
} 
@IBAction func slideToRightWithGestureRecognizer(gestureRecognizer:UISwipeGestureRecognizer) 
{ 
viewOrange.backgroundColor = UIColor.lightGray 
} 
0

Vous ne pouvez pas simuler un geste de reconnaissance de toutes les implications (je veux dire, vous ne pouvez pas réellement faire iOS que ce soit une action réelle de l'utilisateur).

Vous pouvez, cependant, tromper votre propre code en le faisant agir comme s'il s'agissait d'un véritable balayage. Pour cela, vous devez créer un geste de reconnaissance d'abord:

var gestureRecognizerSwipeRight = UISwipeGestureRecognizer(target: self, action: "activatedGestureRecognizer:") 
gestureRecognizerSwipeRight.direction = UISwipeGestureRecognizerDirection.Right 
yourView.addGestureRecognizer(gestureRecognizerSwipeRight) 

Et puis passez directement à votre action:

// Some other place in your code 
self.activatedGestureRecognizer(gesture: gestureRecognizerSwipeRight) 

Votre méthode activatedGestureRecognizer(gesture:) doit être quelque chose comme:

func activatedGestureRecognizer(gesture: UIGestureRecognizer) { 
    if let gestureRecognizer = gesture as? UIGestureRecognizer { 

     // Here you can compare using if gestureRecognizer == gestureRecognizerSwipeRight 
     // ...or you could compare the direction of the gesture recognizer. 
     // It all depends on your implementation really. 

     if gestureRecognizer == gestureRecognizerSwipeRight { 
      // Swipe right detected 
     } 
    } 
} 

En toute justice, je ne vois aucun avantage réel à le faire de cette façon. Il devrait être beaucoup mieux de simplement faire l'action associée au balayage au lieu de simuler réellement le détecteur de mouvement.

Si vous avez besoin, par exemple, d'animer votre carte pendant le swipping, pourquoi ne pas simplement désactiver l'interaction de l'utilisateur sur la vue de votre carte et l'animer par programmation?