Evento táctil UIView en el controlador

95

¿Cómo puedo agregar la acción touchbegin de UIView o tocar la acción programáticamente ya que Xcode no se proporciona desde Main.storyboard?

dhaval shah
fuente
Ese es para el botón, el OP quiere agregar un evento para UIView
Miknash
Utilice a UILongPressGestureRecognizercon el minimumPressDurationajuste a cero. Vea esta respuesta. No requiere subclases ni anular nada.
Suragch

Respuestas:

151

Deberá agregarlo mediante código. Prueba esto:

    // 1.create UIView programmetically
    var myView = UIView(frame: CGRectMake(100, 100, 100, 100))
    // 2.add myView to UIView hierarchy
    self.view.addSubview(myView) 
    // 3. add action to myView
    let gesture = UITapGestureRecognizer(target: self, action: "someAction:")
    // or for swift 2 +
    let gestureSwift2AndHigher = UITapGestureRecognizer(target: self, action:  #selector (self.someAction (_:)))
    self.myView.addGestureRecognizer(gesture)

    func someAction(sender:UITapGestureRecognizer){     
       // do other task
    }

    // or for Swift 3
    func someAction(_ sender:UITapGestureRecognizer){     
       // do other task
    }

    // or for Swift 4
    @objc func someAction(_ sender:UITapGestureRecognizer){     
       // do other task
    }

    // update for Swift UI

    Text("Tap me!")
        .tapAction {
             print("Tapped!")
        }
Miknash
fuente
1
He hecho que me está dando un error cuando hago clic en uiView. Mi código: dejar gesto = UITapGestureRecognizer (destino: self.uiPendingView, acción: "touchPending") self.uiPendingView.addGestureRecognizer (gesto) y método: func touchPending (remitente: AnyObject) {println ("METHOD >>>>>>> >>>>>>>>>> ")}
dhaval shah
1
simplemente agregue: en "touchPending:" y en función parece func touchPending (remitente: UITapGestureRecognizer)
Rizwan Shaikh
1
falta ':' en acción.
Miknash
Hola, ¿Cómo puedo distinguir en qué UIView se hizo clic cuando todos tienen la misma función someAction?
C Williams
La forma más fácil sería usar la propiedad de la etiqueta y luego en la función determinar qué vista es el remitente
Miknash
68

Rápido 4/5:

let gesture = UITapGestureRecognizer(target: self, action:  #selector(self.checkAction))
self.myView.addGestureRecognizer(gesture)

@objc func checkAction(sender : UITapGestureRecognizer) {
    // Do what you want
}

Swift 3:

let gesture = UITapGestureRecognizer(target: self, action:  #selector(self.checkAction(sender:)))
self.myView.addGestureRecognizer(gesture)

func checkAction(sender : UITapGestureRecognizer) {
    // Do what you want
}
ventuz
fuente
3
¡LAS PRIMERAS 2 LÍNEAS SE DEBEN LLAMAR DESDE VIEWDIDLOAD!
Oleksandr
24

Actualizando la respuesta de @ Crashalot para Swift 3.x:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self)
        // do something with your currentPoint
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self)
        // do something with your currentPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self)
        // do something with your currentPoint
    }
}
stevo.mit
fuente
18

Actualizando la respuesta de @ Chackle para Swift 2.x:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.locationInView(self)
        // do something with your currentPoint
    }
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.locationInView(self)
        // do something with your currentPoint
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.locationInView(self)
        // do something with your currentPoint
    }
}
Crashalot
fuente
8

Ponga esto en su UIViewsubclase (es más fácil si crea una subclase para esta funcionalidad).

class YourView: UIView {

  //Define your initialisers here

  override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
      let currentPoint = touch.locationInView(self)
      // do something with your currentPoint
    }
  }

  override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
      let currentPoint = touch.locationInView(self)
      // do something with your currentPoint
    }
  }

  override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
      let currentPoint = touch.locationInView(self)
      // do something with your currentPoint
    }
  }
}
Chackle
fuente
@Chacle, tengo más de 10 Uiview en mi página y quiero agregar acción en algunos de Sub UIView. Entonces, para eso, ¿qué debo cambiar?
dhaval shah
Depende para qué quieras usarlo. ¿Quieres decir cuál UIViewpresionas o quieres manejar algunas prensas en cada una de las UIView?
Chackle
Quiero tocar el evento solo para algunas UIview específicas.
dhaval shah
8

Para rápido 4

@IBOutlet weak var someView: UIView!  
let gesture = UITapGestureRecognizer(target: self, action:  #selector (self.someAction (_:)))
self.someView.addGestureRecognizer(gesture)

@objc func someAction(_ sender:UITapGestureRecognizer){
    print("view was clicked")
}
DevB2F
fuente
5

Rápido 4.2:

@IBOutlet weak var viewLabel1: UIView!
@IBOutlet weak var viewLabel2: UIView!
  override func viewDidLoad() {
    super.viewDidLoad()

    let myView = UITapGestureRecognizer(target: self, action: #selector(someAction(_:)))
    self.viewLabel1.addGestureRecognizer(myView)
}

 @objc func someAction(_ sender:UITapGestureRecognizer){
   viewLabel2.isHidden = true
 }
Hola Đỗ
fuente
5

Cree salidas a partir de vistas creadas en StoryBoard.

@IBOutlet weak var redView: UIView!
@IBOutlet weak var orangeView: UIView!
@IBOutlet weak var greenView: UIView!   

Anula el método touchesBegan. Hay 2 opciones, cada uno puede determinar cuál es mejor para él.

  1. Detecta el tacto en una vista especial.

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
         if let touch = touches.first {
            if touch.view == self.redView {
                tapOnredViewTapped()
            } else if touch.view == self.orangeView {
                orangeViewTapped()
            } else if touch.view == self.greenView {
                greenViewTapped()
            } else {
                return
            }
        }
    
    }
  2. Detecta el punto de contacto en una vista especial.

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            let location = touch.location(in: view)
            if redView.frame.contains(location) {
                redViewTapped()
            } else if orangeView.frame.contains(location) {
                orangeViewTapped()
            } else if greenView.frame.contains(location) {
                greenViewTapped()
            }
        }
    
    }

Por último, debe declarar las funciones a las que se llamará, según la vista en la que haya hecho clic el usuario.

func redViewTapped() {
    print("redViewTapped")
}

func orangeViewTapped() {
    print("orangeViewTapped")
}

func greenViewTapped() {
    print("greenViewTapped")
}
iAleksandr
fuente
Muy bien gran ejemplo gracias a mostrarme !! que también podemos hacer esto usando touchEvent ... solo sé el botón y el gesto bidireccional ... Gracias +1
Yogesh Patel
4

se puede utilizar de esta manera: crear extensión

extension UIView {

    func addTapGesture(action : @escaping ()->Void ){
        let tap = MyTapGestureRecognizer(target: self , action: #selector(self.handleTap(_:)))
        tap.action = action
        tap.numberOfTapsRequired = 1

        self.addGestureRecognizer(tap)
        self.isUserInteractionEnabled = true

    }
    @objc func handleTap(_ sender: MyTapGestureRecognizer) {
        sender.action!()
    }
}

class MyTapGestureRecognizer: UITapGestureRecognizer {
    var action : (()->Void)? = nil
}

y usar de esta manera:

@IBOutlet weak var testView: UIView!
testView.addTapGesture{
   // ...
}
Rasoul Miri
fuente
2

Solo una actualización de las respuestas anteriores:

Si desea ver cambios en el evento de clic, es decir, el color de su UIVIew shud cambia cada vez que el usuario hace clic en UIView, luego realice los cambios como se muestra a continuación ...

class ClickableUIView: UIView {
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            if let touch = touches.first {
                let currentPoint = touch.locationInView(self)
                // do something with your currentPoint
            }

            self.backgroundColor = UIColor.magentaColor()//Color when UIView is clicked.
        }

        override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
            if let touch = touches.first {
                let currentPoint = touch.locationInView(self)
                // do something with your currentPoint
            }

            self.backgroundColor = UIColor.magentaColor()//Color when UIView is clicked.
        }

        override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
            if let touch = touches.first {
                let currentPoint = touch.locationInView(self)
                // do something with your currentPoint
            }

            self.backgroundColor = UIColor.whiteColor()//Color when UIView is not clicked.

}//class closes here

Además, llame a esta clase desde Storyboard & ViewController como:

@IBOutlet weak var panVerificationUIView:ClickableUIView!
Pawan
fuente
2

Actualizando la respuesta de @ stevo.mit para Swift 4.x:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self.view)
        // do something with your currentPoint
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self.view)
        // do something with your currentPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self.view)
        // do something with your currentPoint
    }
}
Jacob Ahlberg
fuente