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?


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()

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

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


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)

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


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

11

Cepat 4

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

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

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

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)

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

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
}

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

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
}

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

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

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
}

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...
}

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.

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) {

     }
}

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

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

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

0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.