Après l'initialisation de la sous-classe de UIImageView
, j'ai la ligne de code suivante:
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
J'ai créé la fonction associée nécessaire:
func handleTap(gestureRecognizer: UITapGestureRecognizer) {
print("In handler")
}
En tapant sur la vue en question, "Dans le gestionnaire n'a jamais été imprimé sur la console". J'ai ensuite supprimé la fonction de gestionnaire pour voir si le compilateur se plaindrait de la fonction manquante. Ça n'a pas.
Je suis vraiment perplexe. J'apprécierais vraiment toute lumière que les gens peuvent apporter à ce sujet.
Mise à jour : Ma classe est en fait une UIImageView
par opposition à UIView
J'ai découvert la réponse après avoir soigneusement examiné mon code.
Une des vues parent a été créée sans fournir un frame:
Bien que ce soit une erreur assez noble pour justifier la suppression de cette question, il est fort probable que quelqu'un d'autre aura également le même problème à l'avenir ...
Essaye ça
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.view.userInteractionEnabled = true
var tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
self.view.addGestureRecognizer(tapGesture)
}
func handleTap(sender : UIView) {
println("Tap Gesture recognized")
}
Très probablement, vous ajoutez UIGestureRecognizer
au mauvais endroit. Voici un exemple de travail avec UIView
de storyboard
. Si vous créez votre UIView
de manière dynamique, vous devez placer cette initialisation dans le constructeur approprié.
class TestView: UIView
{
override func awakeFromNib()
{
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}
func handleTap(gestureRecognizer: UITapGestureRecognizer)
{
println("Here")
}
}
En plus des autres réponses, cela peut être provoqué par l'ajout de la reconnaissance de mouvements à plusieurs vues. Les identificateurs de gestes sont destinés à des vues uniques.
Référence: https://stackoverflow.com/a/5567684/6543020
J'ai rencontré ce problème avec des vues programmatiques.
Mon UIView avec la reconnaissance de geste avait .isUserInteractionEnabled = true, mais il n'a pas répondu aux tap jusqu'à ce que je règle également .isUserInteractionEnabled = true pour ses vues parent.
J'ai trouvé la solution à ce problème après de nombreux essais et erreurs. Donc, il y a deux solution deux ce
1. Ajoutez la GestureRecognizer
dans viewDidLoad () et activez userInteractionEnabled
= true
2. Si vous utilisez la propriété calculée, utilisez lazy var
au lieu de let
.
lazy var profileImageView: UIImageView = {
let iv = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
iv.image = #imageLiteral(resourceName: "gameofthrones_splash")
iv.contentMode = .scaleAspectFill
iv.translatesAutoresizingMaskIntoConstraints = false
iv.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
iv.isUserInteractionEnabled = true
return iv
}()
Ce code fonctionne pour moi avec XCode 7.0.1
import UIKit
class ImageView: UIImageView {
init(frame: CGRect, sender: Bool, myImage: UIImage) {
super.init(frame: frame)
self.image = myImage
initBorderStyle(sender)
// enable user interaction on image.
self.userInteractionEnabled = true
let gesture = UITapGestureRecognizer(target: self, action: "previewImage:")
addGestureRecognizer(gesture)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func previewImage(myGesture: UITapGestureRecognizer? = nil) {
print("i'm clicked")
}
private func initBorderStyle(sender: Bool) {
self.layer.masksToBounds = true
self.layer.cornerRadius = 8
self.layer.borderWidth = 0.5
self.layer.borderColor = getBorderColor(sender)
self.backgroundColor = getColor(sender)
}
func getBorderColor(sender: Bool) -> CGColor {
var result: CGColor
if sender {
result = UIColor(red: 0.374, green: 0.78125, blue: 0.0234375, alpha: 0.5).CGColor
} else {
result = UIColor(red: 0.3125, green: 0.6015625, blue: 0.828125, alpha: 0.5).CGColor
}
return result
}
}