ios - GestureRecognizer no responde al toque
uipangesturerecognizer swift 4 (7)
Además de las otras respuestas, esto puede ser causado al agregar el reconocedor de gestos a múltiples vistas. Los reconocedores de gestos son solo para vistas individuales.
Referencia: https://stackoverflow.com/a/5567684/6543020
Después de la inicialización por subclase de UIImageView , tengo la siguiente línea de código:
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
Creé la función asociada necesaria:
func handleTap(gestureRecognizer: UITapGestureRecognizer) {
print("In handler")
}
Al tocar en la vista en cuestión, "En el controlador nunca se imprimió en la consola". Luego eliminé la función de controlador para ver si el compilador se quejaba de la función que faltaba. No fue así.
Estoy positivamente perplejo. Realmente apreciaría cualquier luz que la gente pueda arrojar sobre esto.
Actualización : Mi clase es en realidad un UIImageView en comparación con UIView
Descubrí la respuesta después de peinar cuidadosamente mi código.
Una de las vistas principales se creó sin proporcionar un frame:
Si bien es un error suficientemente grande como para garantizar la eliminación de estas preguntas, es probable que otra persona tenga el mismo problema en el futuro ...
Encontré la solución a este problema después de mucho ensayo y error. Entonces hay dos soluciones dos esto
1. Agregue GestureRecognizer en viewDidLoad () y active userInteractionEnabled = true
2. Si usa la propiedad calculada, use lazy var lugar de let en la propiedad.
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
}()
Lo más probable es que agregue UIGestureRecognizer en el lugar incorrecto. Aquí está la muestra de trabajo con UIView del storyboard . Si crea su UIView dinámicamente, entonces debe poner esta inicialización en el constructor correcto.
class TestView: UIView
{
override func awakeFromNib()
{
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}
func handleTap(gestureRecognizer: UITapGestureRecognizer)
{
println("Here")
}
}
Prueba esto
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")
}
Este código funciona para mí con 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
}
}