Comment appeler gestuel tap sur UIView de manière programmatique dans swift

j'ai un uivi et et j'y ai ajouté un geste de tap:

let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
myView.addGesture(tap)

j'essaie de l'appeler de façon programmatique dans le fichier test.

sendActionForEvent

j'utilise cette fonction, mais elle ne fonctionne pas:

myView.sendActionForEvent(UIEvents.touchUpDown)

il montre un sélecteur non reconnu envoyé à l'instance.

comment résoudre ce problème?

Merci d'avance

96
demandé sur budidino 2015-02-23 16:46:09

18 réponses

vous devez initialiser UITapGestureRecognizer avec une cible et action, comme cela:

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
tap.delegate = self // This is not required
myView.addGestureRecognizer(tap)

ensuite, vous devez implémenter le gestionnaire, qui sera appelé chaque fois qu'un événement de tap se produit:

func handleTap(sender: UITapGestureRecognizer? = nil) {
    // handling code
}

donc appeler maintenant votre reconnaissance de geste de robinet le gestionnaire d'événement est aussi facile que d'appeler une méthode:

handleTap()
128
répondu Salavat Khanov 2018-06-19 15:18:24

Pour quiconque est à la recherche de "151920920 Swift" 3 solution

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

view.addGestureRecognizer(tap)

view.isUserInteractionEnabled = true

self.view.addSubview(view)

// function which is triggered when handleTap is called
 func handleTap(_ sender: UITapGestureRecognizer) {
     print("Hello World")
  }
75
répondu John Lim 2016-12-31 16:39:33

Juste une remarque - N'oubliez pas de permis une interaction sur le point de vue:

let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)
44
répondu eclewlow 2016-04-15 12:30:10

Pour Swift 4 :

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

view.addGestureRecognizer(tap)

view.isUserInteractionEnabled = true

self.view.addSubview(view)

// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    print("Hello World")
}

dans Swift 4, vous devez indiquer explicitement que la fonction déclenchée est appelable à partir de L'Objectif-C, vous devez donc ajouter @objc too votre fonction handleTap.

voir la réponse de @Ali Beadle ici: Swift 4 Ajouter geste: outrepasser vs @objc

34
répondu RNHTTR 2017-09-14 20:24:37

étape: 1

@IBOutlet var viewTap: UIView!

étape: 2

var tapGesture = UITapGestureRecognizer()

étape: 3

override func viewDidLoad() {
    super.viewDidLoad()
    // TAP Gesture
    tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.myviewTapped(_:)))
    tapGesture.numberOfTapsRequired = 1
    tapGesture.numberOfTouchesRequired = 1
    viewTap.addGestureRecognizer(tapGesture)
    viewTap.isUserInteractionEnabled = true
}

étape: 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

    if self.viewTap.backgroundColor == UIColor.yellow {
        self.viewTap.backgroundColor = UIColor.green
    }else{
        self.viewTap.backgroundColor = UIColor.yellow
    }
}

SORTIE

enter image description here

14
répondu Kirit Modi 2018-08-27 06:15:49

mise en œuvre du geste du robinet

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "touchHappen") 
view.userInteractionEnabled = true
view.addGestureRecognizer(tap)

Appelle cette fonction lorsque le robinet est reconnu.

func touchHappen() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    self.view.endEditing(true)
}

mise à jour pour Swift 3

let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchHappen(_:)))
view.addGestureRecognizer(tap)
view.userInteractionEnabled = true

func touchHappen(_ sender: UITapGestureRecognizer) {
    print("Hello Museer")
}
11
répondu Museer Ahamad Ansari 2018-02-12 14:48:46

C'est comme ça que ça marche dans Swift 3:

@IBOutlet var myView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap))

    myView.addGestureRecognizer(tap)
}

func handleTap() {
    print("tapped")
}
7
répondu Neen 2017-01-31 01:58:35

Swift 4

let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchTapped(_:)))
    self.view.addGestureRecognizer(tap)

@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}
7
répondu Giang 2018-03-14 06:11:04

j'ai travaillé sur Xcode 6.4 sur swift. Voir ci-dessous.

var view1: UIView!

func assignTapToView1() {          
  let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap"))
  //  tap.delegate = self
  view1.addGestureRecognizer(tap)
  self.view .addSubview(view1)

...
}

func handleTap() {
 print("tap working")
 view1.removeFromSuperview()
 // view1.alpha = 0.1
}
6
répondu A.G 2015-10-01 18:55:44

vous devez initialiser UITapGestureRecognizer avec une cible et l'action, comme cela:

let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)

ensuite, vous devez implémenter le gestionnaire, qui sera appelé chaque fois qu'un événement de tap se produit:

func handleTap(sender: UITapGestureRecognizer) {
  // handling code
}
5
répondu Amit Raj Modi 2017-07-17 12:40:08

si vous voulez le code de L'objectif C est donné ci-dessous,

UITapGestureRecognizer *gesRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; // Declare the Gesture.
gesRecognizer.delegate = self;
[yourView addGestureRecognizer:gesRecognizer]; // Add Gesture to your view.

// Declare the Gesture Recognizer handler method.

- (void)handleTap:(UITapGestureRecognizer *)gestureRecognizer{
   NSLog(@"Tapped");
}

ou vous voulez le code swift est donné ci-dessous,

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add tap gesture recognizer to view
        let tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
        myView.addGestureRecognizer(tapGesture)
    }

    // this method is called when a tap is recognized
    func handleTap(sender: UITapGestureRecognizer) {

        print("tap")
    }
}
3
répondu Iyyappan Ravi 2016-04-15 12:45:12
    let tap = UITapGestureRecognizer(target: self, action: Selector("handleFrontTap:"))
    frontView.addGestureRecognizer(tap)

// Make sure this is not private
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
    print("tap working")
}
3
répondu Pramod 2018-02-12 14:46:39

Swift 4

tout d'abord, créer un objet de UITapGestureRecognizer

var tapGesture = UITapGestureRecognizer()

la deuxième étape est d'initialiser UITapGestureReconizer. Activer l'utilisateur l'interaction, puis l'ajouter.

override func viewDidLoad() {
        super.viewDidLoad()
    tapGesture = UITapGestureRecognizer(target: self, action: #selector(YourViewController.myviewTapped(_:)))
            infosView.isUserInteractionEnabled = true
            infosView.addGestureRecognizer(tapGesture)
view.addSubview(infosView)
}

Troisièmement, créer une méthode

@objc func myviewTapped(_ recognizer: UIGestureRecognizer) {
                print("button is tapped")
            }
3
répondu akbar khan 2018-09-06 10:00:06

j'ai travaillé sur Xcode 7.3.1 sur Swift 2.2. Voir ci-dessous.

func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(MyViewController.handleTap))
    tap.numberOfTapsRequired = 1
    self.myView.addGestureRecognizer(tap)
}

func handleTap() {
    // Your code here...
}
2
répondu Daya Kevin 2016-06-25 09:25:52

essayez le code swift suivant (testé dans le code X 6.3.1):

    import UIKit

    class KEUITapGesture150427 : UIViewController {
      var _myTap: UITapGestureRecognizer?
      var _myView: UIView?

      override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.whiteColor();

        _myTap = UITapGestureRecognizer(target: self
, action: Selector("_myHandleTap:"))
        _myTap!.numberOfTapsRequired = 1

        _myView = UIView(frame: CGRectMake(100, 200, 100, 100))
        _myView!.backgroundColor=UIColor.blueColor()
        _myView!.layer.cornerRadius = 20
        _myView!.layer.borderWidth = 1
        _myView!.addGestureRecognizer(_myTap!)
        view.addSubview(_myView!)
      }

      func _myHandleTap(sender: UITapGestureRecognizer) {
        if sender.state == .Ended {
          println("_myHandleTap(sender.state == .Ended)")
          sender.view!.backgroundColor
          = UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
        }
      }
    }

notez que votre cible pourrait être n'importe quelle sous-classe D'UIResponder, voir (testé dans Xcode 6.3.1):

    import UIKit

    class MyTapTarget  : UIResponder {
      func _myHandleTap2(sender: UITapGestureRecognizer) {
        if sender.state == .Ended {
          println("_myHandleTap2(sender.state == .Ended)")
          sender.view!.backgroundColor
            = UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
        }
      }
    }

    class KEUITapGesture150427b : UIViewController {
      var _myTap: UITapGestureRecognizer?
      var _myView: UIView?
      var _myTapTarget: MyTapTarget?

      override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.whiteColor();

        _myTapTarget = MyTapTarget()
        _myTap = UITapGestureRecognizer(target: _myTapTarget!
, action: Selector("_myHandleTap2:"))
        _myTap!.numberOfTapsRequired = 1

        _myView = UIView(frame: CGRectMake(100, 200, 100, 100))
        _myView!.backgroundColor=UIColor.blueColor()
        _myView!.layer.cornerRadius = 20
        _myView!.layer.borderWidth = 1
        _myView!.addGestureRecognizer(_myTap!)
        view.addSubview(_myView!)
      }
    }
1
répondu Dmitry Konovalov 2015-04-27 00:34:37

xCode 9.3, Swift 4.0

class BaseVC: UIViewController, UIGestureRecognizerDelegate { 

      @IBOutlet weak var iView: UIView!

      override func viewDidLoad() {
          super.viewDidLoad()
          let clickUITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.onSelect(_:)))
          clickUITapGestureRecognizer.delegate = self
          iView?.addGestureRecognizer(tap)
      }

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


     @IBAction func onSelect(_ sender: Any) {

     }
}
1
répondu Rahul 2018-05-18 12:31:31

au lieu d'invoquer UITapGestureRecognizer de myView, vous pouvez appeler directement la fonction handleTap ,

0
répondu budidino 2016-06-25 12:47:37

je voulais préciser deux points qui continuaient à me causer des problèmes.

  • j'étais en train de créer le reconnaisseur de geste sur init et de le stocker dans une propriété let. Apparemment, ajouter ce geste recog à la vue ne fonctionne pas. Peut être auto-objet passé au reconnaisseur de geste pendant init, n'est pas correctement configuré.
  • le reconnaisseur de geste ne doit pas être ajouté aux vues avec des cadres zéro. Je crée toutes mes vues avec ZERO frame et puis redimensionnez-les en utilisant autolayout. Les identificateurs gestuels doivent être ajoutés après que les vues ont été redimensionnées par le moteur autolayout. Donc j'ajoute le reconnaisseur de geste dans viewDidAppear et ils fonctionnent.
0
répondu nnrales 2018-02-26 16:46:24