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?

George
quelle
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()
Salavat Khanov
quelle
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")
  }
John Lim
quelle
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

RNHTTR
quelle
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)
eclewlow
quelle
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

Kirit Modi
quelle
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")
}
Museer Ahamad Ansari
quelle
11

Swift 4

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

@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}
Giang
quelle
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")
}
Neen
quelle
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)
George
quelle
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")
        }
    }
ikbal
quelle
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
}
AG
quelle
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")
    }
}
Iyyappan Ravi
quelle
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
}
Amit Raj Modi
quelle
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")
}
Pramod
quelle
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")
            }
Akbar Khan
quelle
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
}
Mahdi Delavar
quelle
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...
}
Daya Kevin
quelle
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.
nnrales
quelle
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) {

     }
}
Rahul
quelle
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)
}
Tej Patel
quelle
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")
        }
    }
}
swiftBoy
quelle
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!)
      }
    }
Dmitry Konovalov
quelle
0

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

Budidino
quelle