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
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()
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")
}
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)
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
é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
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")
}
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")
}
Swift 4
let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchTapped(_:)))
self.view.addGestureRecognizer(tap)
@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}
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
}
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
}
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")
}
}
let tap = UITapGestureRecognizer(target: self, action: Selector("handleFrontTap:"))
frontView.addGestureRecognizer(tap)
// Make sure this is not private
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
print("tap working")
}
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")
}
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...
}
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!)
}
}
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) {
}
}
au lieu d'invoquer UITapGestureRecognizer de myView, vous pouvez appeler directement la fonction handleTap
,
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.