Hızlı bir şekilde programlı olarak UIView'a jest dokunması nasıl çağrılır


166

Bir UIView var ve ben ona dokunun jest ekledim:

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

Ben testfile programlı olarak çağırmak çalışıyorum.

sendActionForEvent

Bu işlevi kullanıyorum, ancak çalışmıyor:

myView.sendActionForEvent(UIEvents.touchUpDown)

Örneğe gönderilen tanınmayan seçiciyi gösterir.

Bu sorunu nasıl çözebilirim?


2
Hızlı 2.2'de yeni seçici sözdizimini kullanabilirsiniz: let = UITapGestureRecognizer öğesine (target: self, action: #selector (self.handleTap (_ :)))
Wujo 5:16 '

@wujo - bunun için teşekkürler; garip bir şekilde aslında benim için çalışmıyor, bir UIView Belki sadece bir görünüm denetleyicisi?
Fattie

2
Ayrıca imageView.userInteractionEnabled = truebir görüntü görünümü kullanıp kullanmadığınızı da unutmayın . Çok uzun süre yakalandım.
Josh

@Josh, evet önemli bir nokta.
NeverHopeless

1
@KhangAzun en iyi seçenek doğrudan musluk işlevini çağırmaktır
George

Yanıtlar:


245

Aşağıdaki UITapGestureRecognizergibi bir hedef ve eylemle başlatmanız gerekir :

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

Ardından, bir dokunma olayı her gerçekleştiğinde çağrılacak işleyiciyi uygulamalısınız:

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

Şimdi dokunma hareketi tanıyıcı olay işleyicinizi çağırmak bir yöntemi çağırmak kadar kolaydır:

handleTap()

seçici işlevini doğrudan çağırmak yerine, programlı olarak UITapGestureRecognizer olayı
George

2
@muhasturk Yükseltilmiş bir cevabın anlamını değiştirmeyin. Yaptığınız düzenleme eski Swift sürümleri için cevabı geçersiz kılıyordu. Swift 2.2 için bir güncelleme göndermek istiyorsanız, kendi cevabınızı gönderin. Teşekkür ederim.
Eric Aya

17
tap.delegate = selfzaten bir hedef ve eylem belirlediğiniz için gerekli değildir
Daniel

4
Swift3'te bir hata atar, tutamaçlı dokunma işleviniz şu şekilde olmalıdır: func handleTap (_ gönderen: UITapGestureRecognizer)
Travis M.

Arama işlevi ................ func handleTap olmalıdır (_ gönderen: UITapGestureRecognizer? = Nil) ............... kaçırdınız "_ "........ böylece arama fonksiyonunuz çalışmıyor ..
Prasad Patil

94

Swift 3 çözümü arayan herkes için

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
isUserInteractionEnabledgerçekten gerekli mi? varsayılan yanlış mı?
jose920405

6
view.isUserInteractionEnabled = truegörünümünüz ImageView veya UIControl yerine herhangi bir UIVIew alt sınıfı olduğunda anahtardır.
Pankaj Kulkarni

61

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

Swift 4'te, tetiklenen işlevin Objective-C'den çağrılabilir olduğunu açıkça belirtmeniz gerekir, bu nedenle handleTap işlevinizi de @objc eklemeniz gerekir.

@Ali Beadle'ın cevabını buradan görebilirsiniz: Swift 4 jest ekle: override vs @objc


view.isUserInteractionEnabled = truegörünümünüz ImageView veya UIControl yerine herhangi bir UIVIew alt sınıfı olduğunda anahtardır.
Pankaj Kulkarni

50

Yalnızca bir not - Görünümde etkileşimi etkinleştirmeyi unutmayın:

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

1
Not önemlidir!
Itai Spector

21

AŞAMA 1

@IBOutlet var viewTap: UIView!

ADIM 2

var tapGesture = UITapGestureRecognizer()

AŞAMA 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
}

ADIM: 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

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

ÇIKTI

resim açıklamasını buraya girin


14

Hafifçe dokunma hareketini uygulama

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

Musluk tanındığında bu işlevi çağırır.

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

Swift 3 için güncelleme

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

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

11

Hızlı 4

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

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

8

Swift 3'te şu şekilde çalışır:

@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

Swift 4 için tam cevap

1.Adım: Görünüm için bir çıkış oluşturun

@IBOutlet weak var rightViewOutlet: UIView!

2.Adım: Bir dokunma hareketini tanımlama

var tapGesture = UITapGestureRecognizer()

3.Adım: ObjC işlevi oluşturun (görünüm dokunulduğunda çağrılır)

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

4.Adım: Aşağıdakileri viewDidLoad () içine ekleyin

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

Adım 2 gerekli değildir.
guido

7

Swift 5.1 Üç görünüm örneği

Adım: 1 -> Film şeridi görünümü ekleyin ve çıkış görünümü ekleyin

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

Adım: 2 -> Hikaye panosu ekle Etiket görüntüle

ilk bakış secondView thirdView

Adım: 3 -> Hareket ekle

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
    }

Adım: 4 -> görünümü seçin

@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

Hızlı Xcode 6.4 üzerinde çalıştım. Aşağıya bakınız.

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

Hedef C kodunun aşağıda verilmesini istiyorsanız,

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

veya hızlı kodun aşağıda verilmesini istiyorsanız,

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

UITapGestureRecognizer'ı aşağıdaki gibi bir hedef ve eylemle başlatmanız gerekir:

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

Ardından, bir dokunma olayı her gerçekleştiğinde çağrılacak işleyiciyi uygulamalısınız:

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

Hızlı 4

İlk olarak, bir UITapGestureRecognizer nesnesi oluşturun

var tapGesture = UITapGestureRecognizer()

İkinci adım UITapGestureReconizer'ı başlatmaktır. Kullanıcı etkileşimini etkinleştirin ve ekleyin.

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

Üçüncü olarak, bir yöntem oluşturun

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

3

aşağıdaki uzantıyı dene

    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
}

ve sonra kullanın:

submitBtn.addTapGesture {
     //your code
}

hücre için bile kullanabilirsiniz

cell.addTapGesture {
     //your code
}

1
Sadece kod yanıtı gerçekten bir cevap olsa da, biraz açıklama (OP kodunun neden işe yaramadığı, kodunuzun ardındaki genel fikir nedir, önemli noktalar, uyarılar, ...) daha iyi bir cevap verebilir.
lfurini

2

Swift 2.2'de Xcode 7.3.1 üzerinde çalıştım. Aşağıya bakınız.

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

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

1
addTapGesture()senin de ekleviewDidLoad()
Daya Kevin

1

Sorunlara neden olan iki noktayı belirtmek istedim.

  • Jest Tanıyıcı'yı init üzerinde oluşturup bir let özelliğinde saklıyordum. Görünüşe göre, bu hareket recog'unu görünüme eklemek işe yaramıyor. Başlatma sırasında hareket tanıyıcıya iletilen kendi kendine nesne olabilir, düzgün yapılandırılmamış.
  • Hareket tanıyıcı sıfır çerçeveli görünümlere eklenmemelidir. Tüm görünümlerimi sıfır çerçeveyle oluşturuyorum ve sonra otomatik yerleşimi kullanarak yeniden boyutlandırıyorum. Hareket tanıma araçlarının, görünümler otomatik yerleşim motoru tarafından yeniden boyutlandırıldıktan SONRA eklenmelidir. Bu yüzden viewDidAppear'da hareket tanıyıcıyı ekliyorum ve çalışıyorlar.

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

     }
}

OnSelect işlevinin IBAction olması gerekmez
Illya Krit

iView? .addGestureRecognizer (dokunun) Hareketinizi TanıyınRecognizer clickUITapGestureRecognizer Bu yüzden doğru yol: iView? .addGestureRecognizer (clickUITapGestureRecognizer)
Illya Krit

1

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

Arama Amacı

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

Posta Amacı

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

Swift 5'te Görünüm Hareketleri eklemenin en basit yolu

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

Aşağıdaki hızlı kodu deneyin (Xcode 6.3.1'de test edilmiştir):

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

Hedefinizin UIResponder'ın herhangi bir alt sınıfı olabileceğini unutmayın, bkz. (Xcode 6.3.1'de test edilmiştir):

    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

MyView'ın UITapGestureRecognizer öğesini çağırmak yerine, doğrudan handleTapişlevi çağırabilirsiniz ,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.