Cara memanggil gesture, ketuk UIView secara terprogram secara cepat

165

Saya punya UIView dan saya telah menambahkan gerakan tap ke dalamnya:

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

Saya mencoba menyebutnya pemrograman di testfile.

sendActionForEvent

Saya menggunakan fungsi ini, tetapi tidak berfungsi:

myView.sendActionForEvent(UIEvents.touchUpDown)

Ini menunjukkan pemilih yang tidak dikenal dikirim ke instance.

Bagaimana saya bisa menyelesaikan masalah ini?

George
sumber
2
Dalam swift 2.2 Anda dapat menggunakan sintaks pemilih baru: biarkan ketuk = UITapGestureRecognizer (target: self, action: #selector (self.handleTap (_ :)))
Wujo
@wujo - terima kasih untuk itu; anehnya itu tidak benar-benar bekerja untuk saya, di UIView. Mungkin hanya di pengontrol tampilan?
Fattie
2
Ingat juga untuk memiliki imageView.userInteractionEnabled = truejika Anda menggunakan tampilan gambar. Terlalu lama terjebak dalam hal itu.
Josh
@ Astaga, ya poin penting.
NeverHopeless
1
@KhangAzun opsi terbaik adalah memanggil fungsi ketuk secara langsung
George

Jawaban:

244

Anda perlu menginisialisasi UITapGestureRecognizerdengan target dan tindakan, seperti:

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

Kemudian, Anda harus mengimplementasikan handler, yang akan dipanggil setiap kali ketika acara tap terjadi:

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

Jadi sekarang memanggil penangan event tap gesture recognitioner Anda semudah memanggil metode:

handleTap()
Salavat Khanov
sumber
alih-alih memanggil fungsi pemilih secara langsung, saya ingin menyebutnya dengan memohon acara UITapGestureRecognizer secara terprogram
George
2
@muhasturk Jangan mengubah arti jawaban yang dipilih. Suntingan Anda membatalkan jawaban untuk versi Swift yang lebih lama. Jika Anda ingin memposting pembaruan untuk Swift 2.2, posting jawaban Anda sendiri. Terima kasih.
Eric Aya
17
tap.delegate = selftidak diperlukan, karena Anda sudah menetapkan target dan tindakan
Daniel
4
Melempar kesalahan pada Swift3, fungsi ketukan pegangan Anda seharusnya: func handleTap (_ sender: UITapGestureRecognizer)
Travis M.
Fungsi panggilan harus ................ func handleTap (_ pengirim: UITapGestureRecognizer? = Nil) ............... Anda melewatkan "_ "........ jadi fungsi panggilanmu tidak berfungsi ..
Prasad Patil
94

Bagi siapa saja yang mencari solusi Swift 3

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
sumber
1
isUserInteractionEnabledapakah benar-benar diperlukan? Nilai defaultnya salah?
jose920405
6
view.isUserInteractionEnabled = trueadalah kuncinya ketika tampilan Anda adalah ImageView atau subkelas UIVIew alih-alih UIControl.
Pankaj Kulkarni
61

Untuk 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")
}

Di Swift 4, Anda perlu secara eksplisit menunjukkan bahwa fungsi yang dipicu dapat dipanggil dari Objective-C, jadi Anda perlu menambahkan @objc juga fungsi handleTap Anda.

Lihat jawaban @Ali Beadle di sini: Swift 4 menambahkan gesture: override vs @objc

RNHTTR
sumber
view.isUserInteractionEnabled = trueadalah kuncinya ketika tampilan Anda adalah ImageView atau subkelas UIVIew alih-alih UIControl.
Pankaj Kulkarni
50

Hanya sebuah catatan - Jangan lupa untuk mengaktifkan interaksi pada tampilan:

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)
Eclewlow
sumber
1
Catatan itu penting!
Itai Spector
21

LANGKAH 1

@IBOutlet var viewTap: UIView!

LANGKAH 2

var tapGesture = UITapGestureRecognizer()

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

LANGKAH: 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

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

KELUARAN

masukkan deskripsi gambar di sini

Kirit Modi
sumber
14

Menerapkan gerakan tap

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

Memanggil fungsi ini ketika ketukan dikenali.

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

Pembaruan untuk 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
sumber
11

Cepat 4

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

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

Ini adalah cara kerjanya di 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
sumber
7

Jawaban lengkap untuk Swift 4

Langkah 1: buat saluran keluar untuk tampilan

@IBOutlet weak var rightViewOutlet: UIView!

Langkah 2: tentukan gerakan tap

var tapGesture = UITapGestureRecognizer()

Langkah 3: buat fungsi ObjC (dipanggil saat tampilan disadap)

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

Langkah 4: tambahkan berikut ini di dalam viewDidLoad ()

let rightTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.rightViewTapped(_:)))
    rightViewOutlet.addGestureRecognizer(rightTap)
George
sumber
Langkah 2 tidak diperlukan.
guido
7

Swift 5.1 Contoh untuk tiga tampilan

Langkah: 1 -> Tambahkan tampilan storyboard dan tambahkan outlet viewController UIView

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

Langkah: 2 -> Tambahkan Tag tampilan storyBoard

firstView pandangan kedua thirdView

Langkah: 3 -> Tambahkan gerakan

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
    }

Langkah: 4 -> pilih tampilan

@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
sumber
6

Saya mengerjakan Xcode 6.4 dengan cepat. Lihat di bawah.

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
sumber
5

Jika Anda ingin kode Objective C diberikan di bawah ini,

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");
}

atau Anda ingin kode cepat diberikan di bawah ini,

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
sumber
5

Anda perlu menginisialisasi UITapGestureRecognizer dengan target dan tindakan, seperti:

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

Kemudian, Anda harus mengimplementasikan handler, yang akan dipanggil setiap kali ketika acara tap terjadi:

func handleTap(sender: UITapGestureRecognizer) {
  // handling code
}
Amit Raj Modi
sumber
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
sumber
3

Cepat 4

Pertama, buat objek UITapGestureRecognizer

var tapGesture = UITapGestureRecognizer()

Langkah kedua adalah menginisialisasi UITapGestureReconizer. Aktifkan interaksi pengguna, lalu tambahkan.

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

Ketiga, buat metode

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

coba ekstensi berikut

    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
}

dan kemudian menggunakannya:

submitBtn.addTapGesture {
     //your code
}

Anda bahkan dapat menggunakannya untuk sel

cell.addTapGesture {
     //your code
}
mahdi delavar
sumber
1
Sementara jawaban hanya kode memang merupakan jawaban, sedikit penjelasan (mengapa kode OP tidak berfungsi, apa ide umum di balik kode Anda, poin penting, peringatan, ...) dapat menjadikannya jawaban yang lebih baik .
lfurini
2

Saya mengerjakan Xcode 7.3.1 di Swift 2.2. Lihat di bawah.

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
sumber
1
tambahkan addTapGesture()di AndaviewDidLoad()
Daya Kevin
1

Saya ingin menentukan dua poin yang terus membuat saya bermasalah.

  • Saya sedang membuat Gesture Recognizer di init dan menyimpannya di properti let. Tampaknya, menambahkan pengenal isyarat ini ke tampilan tidak berfungsi. Mungkin objek diri diteruskan ke pengenal isyarat selama init, tidak dikonfigurasi dengan benar.
  • Pengenal isyarat tidak boleh ditambahkan ke tampilan dengan nol bingkai. Saya membuat semua pandangan saya dengan frame nol dan kemudian mengubah ukurannya menggunakan autolayout. Pengenal isyarat harus ditambahkan SETELAH pandangan telah diubah ukurannya oleh mesin autolayout. Jadi saya menambahkan pengenal isyarat di viewDidAppear dan mereka bekerja.
nnrales
sumber
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
sumber
Fungsi onSelect tidak perlu IBAction
Illya Krit
iView? .addGestureRecognizer (ketuk) Nama gestureRecognizer Anda adalah klikUITapGestureRecognizer Jadi cara yang benar adalah: iView? .addGestureRecognizer (klikUITapGestureRecognizer)
Illya Krit
1

Di dalam 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: [:])
    }
}

Tujuan Memanggil

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

Tujuan Surat

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
sumber
1

Berikut adalah cara paling sederhana untuk menambahkan Gerakan pada Tampilan di Swift 5

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
sumber
0

Coba kode cepat berikut (diuji dalam 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);
        }
      }
    }

Perhatikan bahwa target Anda dapat berupa subclass dari UIResponder, lihat (diuji dalam 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
sumber
0

Alih-alih memanggil UITapGestureRecognizer myView, Anda dapat langsung memanggil handleTapfungsinya,

budidino
sumber