Cómo llamar a un gesto toque UIView programmatically en swift

Tengo un UIView y le agregué un gesto de toque:

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

Intento llamarlo programáticamente en el archivo de prueba.

 sendActionForEvent 

Estoy usando esta función, pero no está funcionando:

 myView.sendActionForEvent(UIEvents.touchUpDown) 

Muestra el selector no reconocido enviado a la instancia.

¿Como puedó resolver esté problema?

Gracias por adelantado

UITapGestureRecognizer inicializar UITapGestureRecognizer con un objective y una acción, de esta manera:

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

Luego, debe implementar el controlador, que será invocado cada vez que ocurra un evento tap:

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

Así que ahora llamar a su manejador de eventos reconocedor de gestos táctiles es tan fácil como llamar a un método:

 handleTap() 

Para cualquiera que esté buscando la solución Swift 3

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

Solo una nota: no olvide habilitar la interacción en la vista:

 let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap)) view.addGestureRecognizer(tap) // view.userInteractionEnabled = true self.view.addSubview(view) 

Para 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") } 

En Swift 4, debe indicar explícitamente que la función activada se puede llamar desde Objective-C, por lo que también necesita agregar @objc a su función handleTap.

Ver la respuesta de @Ali Beadle aquí: Swift 4 agregar gesto: anular vs @objc

PASO 1

 @IBOutlet var viewTap: UIView! 

PASO 2

 var tapGesture = UITapGestureRecognizer() 

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

ETAPA 4

 func myviewTapped(_ sender: UITapGestureRecognizer) { if self.viewTap.backgroundColor == UIColor.yellow { self.viewTap.backgroundColor = UIColor.green }else{ self.viewTap.backgroundColor = UIColor.yellow } } 

SALIDA

enter image description here

Implementando el gesto de toque

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

Llama a esta función cuando se reconoce el toque.

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

Actualización para Swift 3

 let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchHappen(_:))) view.addGestureRecognizer(tap) view.userInteractionEnabled = true func touchHappen(_ sender: UITapGestureRecognizer) { print("Hello Museer") } 

Así es como funciona en 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") } 

Trabajé en Xcode 6.4 en swift. Vea abajo.

 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 } 

Swift 4

 let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchTapped(_:))) self.view.addGestureRecognizer(tap) @objc func touchTapped(_ sender: UITapGestureRecognizer) { } 

Debe inicializar UITapGestureRecognizer con un objective y una acción, de esta manera:

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

Luego, debe implementar el controlador, que será invocado cada vez que ocurra un evento tap:

 func handleTap(sender: UITapGestureRecognizer) { // handling code } 
  let tap = UITapGestureRecognizer(target: self, action: Selector("handleFrontTap:")) frontView.addGestureRecognizer(tap) // Make sure this is not private func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) { print("tap working") } 

Si quieres el código de Objetivo C se da a continuación,

 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"); } 

o si quiere un código rápido se da a continuación,

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

Swift 4

Primero, crea un objeto de UITapGestureRecognizer

 var tapGesture = UITapGestureRecognizer() 

El segundo paso es inicializar UITapGestureReconizer. Habilite la interacción del usuario, luego agréguelo.

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

En tercer lugar, crea un método

 @objc func myviewTapped(_ recognizer: UIGestureRecognizer) { print("button is tapped") } 

Pruebe el siguiente código rápido (probado en Xcode 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); } } } 

Tenga en cuenta que su objective podría ser cualquier subclase de UIResponder, vea (probado en 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!) } } 

Trabajé en Xcode 7.3.1 en Swift 2.2. Vea abajo.

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

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

En lugar de invocar el UITAPGestureRecognizer de myView, puede llamar directamente a la función handleTap ,

Quería especificar dos puntos que seguían causándome problemas.

  • Estaba creando el Reconocedor de gestos en init y lo almacenaba en una propiedad de alquiler. Aparentemente, agregar este gesto reconocido a la vista no funciona. Puede ser objeto propio pasado al reconocedor de gestos durante el inicio, no está configurado correctamente.
  • El reconocedor de gestos no se debe agregar a las vistas con cero marcos. Creo todas mis vistas con cero fotogtwig y luego las cambio de tamaño usando el diseño automático. Los reconocedores de gestos deben agregarse DESPUÉS de que el motor de autodiseño haya cambiado el tamaño de las vistas. Así que agregué el reconocedor de gestos en viewDidAppear y funcionan.