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