ios - tap - uiview touch event swift




Como adicionar um evento de toque a um UIView? (9)

Como adiciono um evento de toque a um UIView?
Eu tento:

UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'

Eu não quero criar uma subclasse e substituir

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

Reconhecedores de gestos

Há vários eventos de toque (ou gestos) comumente usados ​​pelos quais você pode ser notificado quando adiciona um Reconhecedor de gestos à sua exibição. Eles seguem os tipos de gestos são suportados por padrão:

  • UITapGestureRecognizer Tap (tocando brevemente a tela uma ou mais vezes)
  • UILongPressGestureRecognizer Toque longo (tocando a tela por um longo tempo)
  • UIPanGestureRecognizer Pan (movendo o dedo pela tela)
  • UISwipeGestureRecognizer Swipe (dedo em movimento rapidamente)
  • UIPinchGestureRecognizer Pinch (movendo dois dedos juntos ou separados - geralmente para ampliar)
  • UIRotationGestureRecognizer Rotate (movendo dois dedos em uma direção circular)

Além desses, você também pode criar seu próprio reconhecedor de gestos personalizado.

Adicionando um gesto no construtor de interface

Arraste um reconhecedor de gestos da biblioteca de objetos para sua exibição.

Controle o arrasto do gesto no Contorno do Documento para o seu código do Controlador de Visualização para fazer uma Saída e uma Ação.

Isso deve ser definido por padrão, mas também certifique-se de que a Ação do usuário ativada esteja definida como verdadeira para sua exibição.

Adicionando um Gesto Programaticamente

Para adicionar um gesto por meio de programação, você (1) cria um reconhecedor de gestos, (2) adiciona-o a uma visão e (3) cria um método que é chamado quando o gesto é reconhecido.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. create a gesture recognizer (tap gesture)
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))

        // 2. add the gesture recognizer to a view
        myView.addGestureRecognizer(tapGesture)
    }

    // 3. this method is called when a tap is recognized
    @objc func handleTap(sender: UITapGestureRecognizer) {
        print("tap")
    }
}

Notas

  • O parâmetro do sender é opcional. Se você não precisa de uma referência para o gesto, então você pode deixar de fora. Se você fizer isso, remova (sender:) após o nome do método de ação.
  • A nomenclatura do método handleTap era arbitrária. Nomeie o que você quiser usando action: #selector( someMethodName (sender:)) .

Mais exemplos

Você pode estudar os reconhecedores de gestos que adicionei a essas visualizações para ver como eles funcionam.

Aqui está o código para esse projeto:

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var tapView: UIView!
    @IBOutlet weak var doubleTapView: UIView!
    @IBOutlet weak var longPressView: UIView!
    @IBOutlet weak var panView: UIView!
    @IBOutlet weak var swipeView: UIView!
    @IBOutlet weak var pinchView: UIView!
    @IBOutlet weak var rotateView: UIView!
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Tap
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        tapView.addGestureRecognizer(tapGesture)

        // Double Tap
        let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
        doubleTapGesture.numberOfTapsRequired = 2
        doubleTapView.addGestureRecognizer(doubleTapGesture)

        // Long Press
        let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(gesture:)))
        longPressView.addGestureRecognizer(longPressGesture)

        // Pan
        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(gesture:)))
        panView.addGestureRecognizer(panGesture)

        // Swipe (right and left)
        let swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
        let swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
        swipeRightGesture.direction = UISwipeGestureRecognizerDirection.right
        swipeLeftGesture.direction = UISwipeGestureRecognizerDirection.left
        swipeView.addGestureRecognizer(swipeRightGesture)
        swipeView.addGestureRecognizer(swipeLeftGesture)

        // Pinch
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(gesture:)))
        pinchView.addGestureRecognizer(pinchGesture)

        // Rotate
        let rotateGesture = UIRotationGestureRecognizer(target: self, action: #selector(handleRotate(gesture:)))
        rotateView.addGestureRecognizer(rotateGesture)

    }

    // Tap action
    @objc func handleTap() {
        label.text = "Tap recognized"

        // example task: change background color
        if tapView.backgroundColor == UIColor.blue {
            tapView.backgroundColor = UIColor.red
        } else {
            tapView.backgroundColor = UIColor.blue
        }

    }

    // Double tap action
    @objc func handleDoubleTap() {
        label.text = "Double tap recognized"

        // example task: change background color
        if doubleTapView.backgroundColor == UIColor.yellow {
            doubleTapView.backgroundColor = UIColor.green
        } else {
            doubleTapView.backgroundColor = UIColor.yellow
        }
    }

    // Long press action
    @objc func handleLongPress(gesture: UILongPressGestureRecognizer) {
        label.text = "Long press recognized"

        // example task: show an alert
        if gesture.state == UIGestureRecognizerState.began {
            let alert = UIAlertController(title: "Long Press", message: "Can I help you?", preferredStyle: UIAlertControllerStyle.alert)
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }

    // Pan action
    @objc func handlePan(gesture: UIPanGestureRecognizer) {
        label.text = "Pan recognized"

        // example task: drag view
        let location = gesture.location(in: view) // root view
        panView.center = location
    }

    // Swipe action
    @objc func handleSwipe(gesture: UISwipeGestureRecognizer) {
        label.text = "Swipe recognized"

        // example task: animate view off screen
        let originalLocation = swipeView.center
        if gesture.direction == UISwipeGestureRecognizerDirection.right {
            UIView.animate(withDuration: 0.5, animations: {
                self.swipeView.center.x += self.view.bounds.width
            }, completion: { (value: Bool) in
                self.swipeView.center = originalLocation
            })
        } else if gesture.direction == UISwipeGestureRecognizerDirection.left {
            UIView.animate(withDuration: 0.5, animations: {
                self.swipeView.center.x -= self.view.bounds.width
            }, completion: { (value: Bool) in
                self.swipeView.center = originalLocation
            })
        }
    }

    // Pinch action
    @objc func handlePinch(gesture: UIPinchGestureRecognizer) {
        label.text = "Pinch recognized"

        if gesture.state == UIGestureRecognizerState.changed {
            let transform = CGAffineTransform(scaleX: gesture.scale, y: gesture.scale)
            pinchView.transform = transform
        }
    }

    // Rotate action
    @objc func handleRotate(gesture: UIRotationGestureRecognizer) {
        label.text = "Rotate recognized"

        if gesture.state == UIGestureRecognizerState.changed {
            let transform = CGAffineTransform(rotationAngle: gesture.rotation)
            rotateView.transform = transform
        }
    }
}

Notas

  • Você pode adicionar vários reconhecedores de gestos a uma única visualização. Por uma questão de simplicidade, porém, eu não fiz isso (exceto pelo gesto de furto). Se você precisa para o seu projeto, você deve ler a documentação do reconhecedor de gestos . É bastante compreensível e útil.
  • Problemas conhecidos com meus exemplos acima: (1) A visualização panorâmica redefine seu quadro no próximo evento de gesto. (2) A visualização de furto vem da direção errada no primeiro deslize. (Esses bugs nos meus exemplos não devem afetar sua compreensão de como funcionam os Reconhecedores de gestos.)

Aqui está o ios tapgesture; Primeiro você precisa criar uma ação para o GestureRecognizer depois de escrever o código abaixo sob a ação como mostrado abaixo

- (IBAction)tapgesture:(id)sender

{


[_password resignFirstResponder];


[_username resignFirstResponder];

NSLog(@" TapGestureRecognizer  tapped");

}

Com base na resposta aceita, você pode definir uma macro:

#define handle_tap(view, delegate, selector) do {\
    view.userInteractionEnabled = YES;\
    [view addGestureRecognizer: [[UITapGestureRecognizer alloc] initWithTarget:delegate action:selector]];\
} while(0)

Esta macro usa ARC, então não há chamada de release .

Exemplo de uso de macro:

handle_tap(userpic, self, @selector(onTapUserpic:));

Crie um reconhecedor de gestos (subclasse), que implementará os eventos de toque, como o touchesBegan . Você pode adicioná-lo à exibição depois disso.

Dessa forma, você usará composição em vez de subclassificação (que foi a solicitação).


No Swift 4.2 e no Xcode 10

Use UITapGestureRecognizer para adicionar evento de toque

//Add tap gesture to your view
let tap = UITapGestureRecognizer(target: self, action: #selector(handleGesture))
yourView.addGestureRecognizer(tap)

// GestureRecognizer
@objc func handleGesture(gesture: UITapGestureRecognizer) -> Void {
//Write your code here
}

Se você quiser usar SharedClass

//This is my shared class
import UIKit

class SharedClass: NSObject {

    static let sharedInstance = SharedClass()

    //Tap gesture function
    func addTapGesture(view: UIView, target: Any, action: Selector) {
        let tap = UITapGestureRecognizer(target: target, action: action)
        view.addGestureRecognizer(tap)
    }
} 

Eu tenho 3 visualizações no meu ViewController chamado view1, view2 e view3.

override func viewDidLoad() {
    super.viewDidLoad()
    //Add gestures to your views
    SharedClass.sharedInstance.addTapGesture(view: view1, target: self, action: #selector(handleGesture))
    SharedClass.sharedInstance.addTapGesture(view: view2, target: self, action: #selector(handleGesture))
    SharedClass.sharedInstance.addTapGesture(view: view3, target: self, action: #selector(handleGesture2))

}

// GestureRecognizer
@objc func handleGesture(gesture: UITapGestureRecognizer) -> Void {
    print("printed 1&2...")
}
// GestureRecognizer
@objc func handleGesture2(gesture: UITapGestureRecognizer) -> Void {
    print("printed3...")
}

No iOS 3.2 e superior, você pode usar reconhecedores de gestos. Por exemplo, é assim que você lidaria com um evento de toque:

//The setup code (in viewDidLoad in your view controller)
UITapGestureRecognizer *singleFingerTap = 
  [[UITapGestureRecognizer alloc] initWithTarget:self 
                                          action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleFingerTap];

//The event handling method
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
  CGPoint location = [recognizer locationInView:[recognizer.view superview]];

  //Do stuff here...
}

Há um monte de gestos embutidos também. Confira os documentos para manipulação de eventos do iOS e o UIGestureRecognizer . Eu também tenho um monte de exemplos de código no github que podem ajudar.


Por que vocês não tentam o SSEventListener ?

Você não precisa criar nenhum reconhecedor de gestos e separar sua lógica para outro método. SSEventListener suporta a configuração de blocos de ouvintes em uma visualização para ouvir o gesto de toque único, o gesto de toque duplo e o gesto de tocar em N, se desejar, e pressionar por muito tempo o gesto. Definir um ouvinte de gesto de toque único se torna assim:

[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];


Swift 3:

let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGestureRecognizer(_:)))
view.addGestureRecognizer(tapGestureRecognizer)

func handleTapGestureRecognizer(_ gestureRecognizer: UITapGestureRecognizer) {

}

Swift 3 e Swift 4

import UIKit

extension UIView {
  func addTapGesture(tapNumber: Int, target: Any, action: Selector) {
    let tap = UITapGestureRecognizer(target: target, action: action)
    tap.numberOfTapsRequired = tapNumber
    addGestureRecognizer(tap)
    isUserInteractionEnabled = true
  }
}

Usar

yourView.addTapGesture(tapNumber: 1, target: self, action: #selector(yourMethod))




touch