web-dev-qa-db-fra.com

Swift UIGestureRecogniser suivre le doigt

Je crée une application iOS8 à l'aide de Swift. J'aimerais que l'utilisateur puisse utiliser des gestes pour révéler certaines parties de l'interface. Ainsi, par exemple, l'utilisateur fait glisser son doigt vers le haut et la vue sur laquelle il a glissé son doigt se déplace hors du chemin, en suivant son doigt pour révéler une autre vue en dessous.

Ce que j'aimerais, c'est un geste pour donner un résultat similaire à la boîte de notification que vous pouvez dérouler du haut de l'écran. J'ai regardé la documentation et je n'arrive pas à trouver un geste approprié.

J'en ai vu un appelé UISwipeGestureRecogniser, mais le seul problème est qu'il ne suit pas votre doigt, il exécute simplement une fonction lorsque je fais glisser mon doigt vers le haut/bas.

Voici la page de documentation: https://developer.Apple.com/documentation/uikit/uigesturerecognizer

29
Francis

Vous recherchez le UIPanGestureRecognizer . Vous trouverez la Apple Documentation ici .

Voici un exemple de gestionnaire qui déplacera une vue avec votre doigt. Dans Interface Builder, ajoutez un UIPanGestureRecognizer à une vue que vous voulez pouvoir faire glisser. Définissez le délégué sur votre ViewController. Définissez l'action sur cette action:

Swift 2.X:

@IBAction func handlePan(gestureRecognizer: UIPanGestureRecognizer) {
    if gestureRecognizer.state == .Began || gestureRecognizer.state == .Changed {

        let translation = gestureRecognizer.translationInView(self.view)  
        // note: 'view' is optional and need to be unwrapped
        gestureRecognizer.view!.center = CGPointMake(gestureRecognizer.view!.center.x + translation.x, gestureRecognizer.view!.center.y + translation.y)  
        gestureRecognizer.setTranslation(CGPointMake(0,0), inView: self.view)  
    }  
}  

Swift 3:

@IBAction func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {

        let translation = gestureRecognizer.translation(in: self.view)
        // note: 'view' is optional and need to be unwrapped
        gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y)
        gestureRecognizer.setTranslation(CGPoint.zero, in: self.view)
    }
}

Bien sûr, vous pouvez ajouter le UIPanGestureRecognizer par programme:

Dans viewDidLoad pour votre ViewController, créez le module de reconnaissance et ajoutez-le à la vue que vous souhaitez pouvoir faire glisser:

    let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
    self.someDraggableView.addGestureRecognizer(gestureRecognizer)
84
vacawama