So rufen Sie Gesten auf tippen Sie schnell auf UIView


165

Ich habe eine UIView und habe eine Tap-Geste hinzugefügt:

let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
myView.addGesture(tap)

Ich versuche es programmgesteuert in der Testdatei aufzurufen.

sendActionForEvent

Ich benutze diese Funktion, aber sie funktioniert nicht:

myView.sendActionForEvent(UIEvents.touchUpDown)

Es zeigt den nicht erkannten Selektor, der an die Instanz gesendet wurde.

Wie kann ich dieses Problem lösen?


2
In Swift 2.2 können Sie die neue Selektorsyntax verwenden: let tap = UITapGestureRecognizer (Ziel: self, Aktion: #selector (self.handleTap (_ :)))
Wujo

@ Wujo - danke dafür; Seltsamerweise funktioniert es bei mir nicht wirklich, in einem UIView Vielleicht nur in einem View Controller?
Fattie

2
Denken imageView.userInteractionEnabled = trueSie auch daran, wenn Sie eine Bildansicht verwenden. Ich habe mich zu lange damit beschäftigt.
Josh

@ Josh, ja ein wichtiger Punkt.
NeverHopeless

1
@KhangAzun Die beste Option ist, die Tap-Funktion direkt aufzurufen
George

Antworten:


243

Sie müssen UITapGestureRecognizermit einem Ziel und einer Aktion wie folgt initialisieren :

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
myView.addGestureRecognizer(tap)

Anschließend sollten Sie den Handler implementieren, der jedes Mal aufgerufen wird, wenn ein Tap-Ereignis auftritt:

@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
    // handling code
}

Das Aufrufen der Ereignisbehandlungsroutine zur Erkennung von Tap-Gesten ist jetzt so einfach wie das Aufrufen einer Methode:

handleTap()

Anstatt die Auswahlfunktion direkt aufzurufen, möchte ich sie durch programmgesteuertes Aufrufen des UITapGestureRecognizer-Ereignisses aufrufen
George

2
@muhasturk Ändere nicht die Bedeutung einer positiv bewerteten Antwort. Ihre Bearbeitung hat die Antwort für ältere Swift-Versionen ungültig gemacht. Wenn Sie ein Update für Swift 2.2 veröffentlichen möchten, geben Sie Ihre eigene Antwort ein. Danke dir.
Eric Aya

17
tap.delegate = selfwird nicht benötigt, da Sie bereits ein Ziel und eine Aktion festgelegt haben
Daniel

4
Wirft einen Fehler in Swift3, Ihre Handle-Tap-Funktion sollte lauten: func handleTap (_ Absender: UITapGestureRecognizer)
Travis M.

Die Aufruffunktion sollte ................ func handleTap (_ Absender: UITapGestureRecognizer? = Null) sein ............... Sie haben "_ "........ also funktionierte Ihre Anruffunktion nicht ..
Prasad Patil

94

Für alle, die nach einer Swift 3- Lösung suchen

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

view.addGestureRecognizer(tap)

view.isUserInteractionEnabled = true

self.view.addSubview(view)

// function which is triggered when handleTap is called
 func handleTap(_ sender: UITapGestureRecognizer) {
     print("Hello World")
  }

1
isUserInteractionEnabledist wirklich notwendig? Der Standardwert ist false.
Jose920405

6
view.isUserInteractionEnabled = trueist der Schlüssel, wenn Ihre Ansicht ImageView oder eine Unterklasse von UIVIew anstelle von UIControl ist.
Pankaj Kulkarni

61

Für Swift 4 :

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

view.addGestureRecognizer(tap)

view.isUserInteractionEnabled = true

self.view.addSubview(view)

// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    print("Hello World")
}

In Swift 4 müssen Sie explizit angeben, dass die ausgelöste Funktion von Objective-C aus aufgerufen werden kann. Daher müssen Sie auch @objc zu Ihrer handleTap-Funktion hinzufügen.

Siehe @Ali Beadles Antwort hier: Swift 4 Geste hinzufügen: Override vs @objc


view.isUserInteractionEnabled = trueist der Schlüssel, wenn Ihre Ansicht ImageView oder eine Unterklasse von UIVIew anstelle von UIControl ist.
Pankaj Kulkarni

50

Nur eine Anmerkung - Vergessen Sie nicht, die Interaktion in der Ansicht zu aktivieren:

let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

1
Der Hinweis ist wichtig!
Itai Spector

21

SCHRITT 1

@IBOutlet var viewTap: UIView!

SCHRITT 2

var tapGesture = UITapGestureRecognizer()

SCHRITT 3

override func viewDidLoad() {
    super.viewDidLoad()
    // TAP Gesture
    tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.myviewTapped(_:)))
    tapGesture.numberOfTapsRequired = 1
    tapGesture.numberOfTouchesRequired = 1
    viewTap.addGestureRecognizer(tapGesture)
    viewTap.isUserInteractionEnabled = true
}

SCHRITT 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

    if self.viewTap.backgroundColor == UIColor.yellow {
        self.viewTap.backgroundColor = UIColor.green
    }else{
        self.viewTap.backgroundColor = UIColor.yellow
    }
}

AUSGABE

Geben Sie hier die Bildbeschreibung ein


14

Tap-Geste implementieren

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "touchHappen") 
view.userInteractionEnabled = true
view.addGestureRecognizer(tap)

Ruft diese Funktion auf, wenn das Tippen erkannt wird.

func touchHappen() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    self.view.endEditing(true)
}

Update für For Swift 3

let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchHappen(_:)))
view.addGestureRecognizer(tap)
view.userInteractionEnabled = true

func touchHappen(_ sender: UITapGestureRecognizer) {
    print("Hello Museer")
}

11

Swift 4

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

@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}

8

So funktioniert es in Swift 3:

@IBOutlet var myView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap))

    myView.addGestureRecognizer(tap)
}

func handleTap() {
    print("tapped")
}

7

Vollständige Antwort für Swift 4

Schritt 1: Erstellen Sie eine Steckdose für die Ansicht

@IBOutlet weak var rightViewOutlet: UIView!

Schritt 2: Definieren Sie eine Tippgeste

var tapGesture = UITapGestureRecognizer()

Schritt 3: ObjC-Funktion erstellen (wird aufgerufen, wenn die Ansicht getippt wird)

@objc func rightViewTapped(_ recognizer: UIGestureRecognizer) {
    print("Right button is tapped")
}

Schritt 4: Fügen Sie in viewDidLoad () Folgendes hinzu

let rightTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.rightViewTapped(_:)))
    rightViewOutlet.addGestureRecognizer(rightTap)

Schritt 2 ist nicht erforderlich.
Guido

7

Swift 5.1 Beispiel für drei Ansichten

Schritt: 1 -> Storyboard-Ansicht hinzufügen und Outlet-Ansicht hinzufügenController UIView

@IBOutlet var firstView: UIView!
@IBOutlet var secondView: UIView!
@IBOutlet var thirdView: UIView!

Schritt: 2 -> StoryBoard-Ansichtstag hinzufügen

Erster Blick secondView ThirdView

Schritt: 3 -> Geste hinzufügen

override func viewDidLoad() {
        super.viewDidLoad()

        firstView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
        firstView.isUserInteractionEnabled = true
        secondView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
        secondView.isUserInteractionEnabled = true
        thirdView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
        thirdView.isUserInteractionEnabled = true
    }

Schritt: 4 -> Ansicht auswählen

@objc func tap(_ gestureRecognizer: UITapGestureRecognizer) {
        let tag = gestureRecognizer.view?.tag
        switch tag! {
        case 1 :
            print("select first view")
        case 2 :
            print("select second view")
        case 3 :
            print("select third view")
        default:
            print("default")
        }
    }

6

Ich habe schnell an Xcode 6.4 gearbeitet. Siehe unten.

var view1: UIView!

func assignTapToView1() {          
  let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap"))
  //  tap.delegate = self
  view1.addGestureRecognizer(tap)
  self.view .addSubview(view1)

...
}

func handleTap() {
 print("tap working")
 view1.removeFromSuperview()
 // view1.alpha = 0.1
}

5

Wenn Sie möchten, dass der Ziel-C-Code unten angegeben ist,

UITapGestureRecognizer *gesRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; // Declare the Gesture.
gesRecognizer.delegate = self;
[yourView addGestureRecognizer:gesRecognizer]; // Add Gesture to your view.

// Declare the Gesture Recognizer handler method.

- (void)handleTap:(UITapGestureRecognizer *)gestureRecognizer{
   NSLog(@"Tapped");
}

oder Sie möchten schnellen Code ist unten angegeben,

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add tap gesture recognizer to view
        let tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
        myView.addGestureRecognizer(tapGesture)
    }

    // this method is called when a tap is recognized
    func handleTap(sender: UITapGestureRecognizer) {

        print("tap")
    }
}

5

Sie müssen UITapGestureRecognizer mit einem Ziel und einer Aktion wie folgt initialisieren:

let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)

Anschließend sollten Sie den Handler implementieren, der jedes Mal aufgerufen wird, wenn ein Tap-Ereignis auftritt:

func handleTap(sender: UITapGestureRecognizer) {
  // handling code
}

3
    let tap = UITapGestureRecognizer(target: self, action: Selector("handleFrontTap:"))
    frontView.addGestureRecognizer(tap)

// Make sure this is not private
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
    print("tap working")
}

3

Swift 4

Erstellen Sie zunächst ein Objekt von UITapGestureRecognizer

var tapGesture = UITapGestureRecognizer()

Der zweite Schritt ist die Initialisierung von UITapGestureReconizer. Aktivieren Sie die Benutzerinteraktion und fügen Sie sie hinzu.

override func viewDidLoad() {
        super.viewDidLoad()
    tapGesture = UITapGestureRecognizer(target: self, action: #selector(YourViewController.myviewTapped(_:)))
            infosView.isUserInteractionEnabled = true
            infosView.addGestureRecognizer(tapGesture)
view.addSubview(infosView)
}

Drittens erstellen Sie eine Methode

@objc func myviewTapped(_ recognizer: UIGestureRecognizer) {
                print("button is tapped")
            }

3

Versuchen Sie die folgende Erweiterung

    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
}

und dann benutze es:

submitBtn.addTapGesture {
     //your code
}

Sie können es sogar für Zellen verwenden

cell.addTapGesture {
     //your code
}

1
Während eine Nur-Code-Antwort in der Tat eine Antwort ist, könnte eine kleine Erklärung (warum der Code des OP nicht funktioniert hat, was die allgemeine Idee hinter Ihrem Code ist, wichtige Punkte, Warnungen, ...) eine bessere Antwort sein.
lfurini

2

Ich habe an Xcode 7.3.1 auf Swift 2.2 gearbeitet. Siehe unten.

func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(MyViewController.handleTap))
    tap.numberOfTapsRequired = 1
    self.myView.addGestureRecognizer(tap)
}

func handleTap() {
    // Your code here...
}

1
Fügen Sie addTapGesture()in IhremviewDidLoad()
Daya Kevin

1

Ich wollte zwei Punkte angeben, die mir immer wieder Probleme bereiteten.

  • Ich habe den Gestenerkenner auf init erstellt und in einer let-Eigenschaft gespeichert. Anscheinend funktioniert das Hinzufügen dieser Gestenerkennung zur Ansicht nicht. Möglicherweise wird während der Initialisierung ein Selbstobjekt an den Gestenerkenner übergeben, das nicht ordnungsgemäß konfiguriert ist.
  • Die Gestenerkennung sollte nicht zu Ansichten mit null Frames hinzugefügt werden. Ich erstelle alle meine Ansichten ohne Rahmen und ändere sie dann mithilfe des automatischen Layouts in der Größe. Die Gestenerkenner müssen hinzugefügt werden, nachdem die Größe der Ansichten von der Autolayout-Engine geändert wurde. Also füge ich den Gestenerkenner in viewDidAppear hinzu und sie funktionieren.

1

xCode 9.3, Swift 4.0

class BaseVC: UIViewController, UIGestureRecognizerDelegate { 

      @IBOutlet weak var iView: UIView!

      override func viewDidLoad() {
          super.viewDidLoad()
          let clickUITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.onSelect(_:)))
          clickUITapGestureRecognizer.delegate = self
          iView?.addGestureRecognizer(tap)
      }

      func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
          return true
      }


     @IBAction func onSelect(_ sender: Any) {

     }
}

Die Funktion onSelect muss nicht IBAction sein
Illya Krit

iView? .addGestureRecognizer (tippen) Der Name Ihres gestureRecognizer lautet clickUITapGestureRecognizer. Der richtige Weg ist also: iView? .addGestureRecognizer (clickUITapGestureRecognizer)
Illya Krit

1

Innerhalb von ViewDidLoad

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    self.imgMainAdView.isUserInteractionEnabled = true
    self.imgMainAdView.addGestureRecognizer(tapGestureRecognizer)

//MARK: - Image Tap Method -
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    print("Tapped")
    if let url = URL(string: self.strMAinAdvLink)
    {
        UIApplication.shared.open(url, options: [:])
    }
}

Aufruf Zweck

@IBAction func btnCall1Action(_ sender: Any)
{
    let text = self.strPhoneNumber1!
    let test = String(text.filter { !" -()".contains($0) })
    UIApplication.shared.openURL(NSURL(string: "tel://\(test)")! as URL)
}

Mail Zweck

MFMailComposeViewControllerDelegate

 @IBAction func btnMailAction(_ sender: Any)
{
    let strEmail = SAFESTRING(str:  (self.dictEventDetails?.value(forKeyPath: "Email.value_text.email") as! String))

    if !MFMailComposeViewController.canSendMail()
    {
        AppDelegate.sharedInstance().showAlertAction(strTitle: "OK", strMessage: "Mail services are not available") { (success) in
        }
        return
    }
    let composeVC = MFMailComposeViewController()
    composeVC.mailComposeDelegate = self
    composeVC.setToRecipients([strEmail])
    composeVC.setSubject("")
    composeVC.setMessageBody("", isHTML: false)
    self.present(composeVC, animated: true, completion: nil)
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)
{
    controller.dismiss(animated: true, completion: nil)
}

1

Hier ist der einfachste Weg, um in Swift 5 Gesten in der Ansicht hinzuzufügen

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        addGestures()
    }

    // MARK: Add Gestures to target view
    func addGestures()
    {
        // 1. Single Tap or Touch
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapGetstureDetected))
        tapGesture.numberOfTapsRequired = 1
        view.addGestureRecognizer(tapGesture)

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

        //3. Swipe
        let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeGetstureDetected))
        view.addGestureRecognizer(swipeGesture)

        //4. Pinch
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(self.pinchGetstureDetected))
        view.addGestureRecognizer(pinchGesture)

        //5. Long Press
        let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressGetstureDetected))
        view.addGestureRecognizer(longPressGesture)

        //6. Pan
        let panGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.panGestureDetected))
        view.addGestureRecognizer(panGesture)

    }

    // MARK: Handle Gesture detection
    @objc func swipeGetstureDetected() {
        print("Swipe Gesture detected!!")
    }

    @objc func tapGetstureDetected() {
        print("Touch/Tap Gesture detected!!")
    }

    @objc func pinchGetstureDetected() {
        print("Pinch Gesture detected!!")
    }

    @objc func longPressGetstureDetected() {
        print("Long Press Gesture detected!!")
    }

    @objc func doubleTapGestureDetected() {
        print("Double Tap Gesture detected!!")
    }

    @objc func panGestureDetected()
    {
        print("Pan Gesture detected!!")
    }


    //MARK: Shake Gesture
    override func becomeFirstResponder() -> Bool {
        return true
    }
    override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?){
        if motion == .motionShake
        {
            print("Shake Gesture Detected")
        }
    }
}

0

Versuchen Sie den folgenden schnellen Code (getestet in Xcode 6.3.1):

    import UIKit

    class KEUITapGesture150427 : UIViewController {
      var _myTap: UITapGestureRecognizer?
      var _myView: UIView?

      override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.whiteColor();

        _myTap = UITapGestureRecognizer(target: self
, action: Selector("_myHandleTap:"))
        _myTap!.numberOfTapsRequired = 1

        _myView = UIView(frame: CGRectMake(100, 200, 100, 100))
        _myView!.backgroundColor=UIColor.blueColor()
        _myView!.layer.cornerRadius = 20
        _myView!.layer.borderWidth = 1
        _myView!.addGestureRecognizer(_myTap!)
        view.addSubview(_myView!)
      }

      func _myHandleTap(sender: UITapGestureRecognizer) {
        if sender.state == .Ended {
          println("_myHandleTap(sender.state == .Ended)")
          sender.view!.backgroundColor
          = UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
        }
      }
    }

Beachten Sie, dass Ihr Ziel eine beliebige Unterklasse von UIResponder sein kann, siehe (getestet in Xcode 6.3.1):

    import UIKit

    class MyTapTarget  : UIResponder {
      func _myHandleTap2(sender: UITapGestureRecognizer) {
        if sender.state == .Ended {
          println("_myHandleTap2(sender.state == .Ended)")
          sender.view!.backgroundColor
            = UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
        }
      }
    }

    class KEUITapGesture150427b : UIViewController {
      var _myTap: UITapGestureRecognizer?
      var _myView: UIView?
      var _myTapTarget: MyTapTarget?

      override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.whiteColor();

        _myTapTarget = MyTapTarget()
        _myTap = UITapGestureRecognizer(target: _myTapTarget!
, action: Selector("_myHandleTap2:"))
        _myTap!.numberOfTapsRequired = 1

        _myView = UIView(frame: CGRectMake(100, 200, 100, 100))
        _myView!.backgroundColor=UIColor.blueColor()
        _myView!.layer.cornerRadius = 20
        _myView!.layer.borderWidth = 1
        _myView!.addGestureRecognizer(_myTap!)
        view.addSubview(_myView!)
      }
    }

0

Anstatt den UITapGestureRecognizer von myView aufzurufen, können Sie die handleTapFunktion direkt aufrufen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.