यूएवीवाई पर जेस्चर टैप को प्रोग्रामिक रूप से स्विफ्ट में कैसे कॉल करें


166

मेरे पास एक UIView है और मैंने इसमें टैप जेस्चर जोड़ा है:

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

मैं इसे टेस्टफाइल में प्रोग्रामेटिक रूप से कॉल करने का प्रयास कर रहा हूं।

sendActionForEvent

मैं इस फ़ंक्शन का उपयोग कर रहा हूं, लेकिन यह काम नहीं कर रहा है:

myView.sendActionForEvent(UIEvents.touchUpDown)

यह अज्ञात पहचानकर्ता को उदाहरण के लिए भेजा गया दिखाता है।

इस समस्या का समाधान किस प्रकार से किया जा सकता है?


2
स्विफ्ट 2.2 में आप नए चयनकर्ता वाक्यविन्यास का उपयोग कर सकते हैं: टैप करें = UITapGestureRecognizer (लक्ष्य: स्वयं, क्रिया: #selector (self.handleTap (_ :)))
Wujo

@wujo - उसके लिए धन्यवाद; अजीब तरह से यह वास्तव में मेरे लिए काम नहीं करता है, एक यूआईईवीवाई में शायद केवल एक दृश्य नियंत्रक में?
फेटी

2
यह भी याद रखें कि imageView.userInteractionEnabled = trueयदि आप छवि दृश्य का उपयोग कर रहे हैं। बहुत लंबे समय के लिए उस पर पकड़ लिया।
जोश

@ जोश, हाँ एक महत्वपूर्ण बिंदु।
NeverHopless

1
@KhangAzun सबसे अच्छा विकल्प सीधे नल फ़ंक्शन को कॉल करना है
जॉर्ज

जवाबों:


245

आपको UITapGestureRecognizerलक्ष्य और कार्रवाई के साथ आरंभ करने की आवश्यकता है , जैसे:

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

फिर, आपको उस हैंडलर को लागू करना चाहिए, जो हर बार टैप इवेंट होने पर कहा जाएगा:

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

तो अब अपने टैप जेस्चर पहचानकर्ता ईवेंट हैंडलर को कॉल करना एक विधि को कॉल करना जितना आसान है:

handleTap()

सीधे चयनकर्ता फ़ंक्शन को कॉल करने के बजाय, मैं इसे प्रोग्रामेटिक रूप से UITapGestureRecognizer इवेंट को कॉल करके कॉल करना चाहता हूं
जॉर्ज

2
@muhasturk एक उत्क्रमित उत्तर का अर्थ न बदलें। आपका संपादन पुराने स्विफ्ट संस्करणों के उत्तर को अमान्य कर रहा था। यदि आप स्विफ्ट 2.2 के लिए अपडेट पोस्ट करना चाहते हैं, तो अपना खुद का उत्तर पोस्ट करें। धन्यवाद।
एरिक आया

17
tap.delegate = selfजरूरत नहीं है, क्योंकि आप पहले से ही एक लक्ष्य और कार्रवाई निर्धारित करते हैं
डैनियल

4
Swift3 में एक त्रुटि फेंकता है, आपका हैंडल टैप फ़ंक्शन होना चाहिए: func handleTap (_ प्रेषक: UITapGestureRecognizer)
ट्रैविस एम।

कॉलिंग फ़ंक्शन होना चाहिए ................ func handleTap (_ प्रेषक: UITapGestureRecognizer? = Nil) ............... आप चूक गए "_ "........ तो आपका कॉलिंग फंक्शन काम नहीं कर रहा था ..
प्रसाद पाटिल

94

किसी के लिए जो स्विफ्ट 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
isUserInteractionEnabledक्या वास्तव में आवश्यक है? डिफॉल्ट गलत है?
jose920405

6
view.isUserInteractionEnabled = trueजब आपका दृश्य ImageView या UICIont के बजाय UIVIew के किसी उपवर्ग की कुंजी हो।
पंकज कुलकर्णी

61

के लिए स्विफ्ट 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")
}

स्विफ्ट 4 में, आपको स्पष्ट रूप से इंगित करने की आवश्यकता है कि ट्रिगर फ़ंक्शन ऑब्जेक्टिव-सी से कॉल करने योग्य है, इसलिए आपको @objc को भी अपने हैंडपैप फ़ंक्शन को जोड़ना होगा।

@Ali Beadle का जवाब यहां देखें: स्विफ्ट 4 में इशारा जोड़ें: ओवरराइड बनाम @objc


view.isUserInteractionEnabled = trueजब आपका दृश्य ImageView या UICIont के बजाय UIVIew के किसी भी उपवर्ग की कुंजी है।
पंकज कुलकर्णी

50

बस एक नोट - दृश्य पर सक्षम बातचीत करने के लिए मत भूलना:

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

1
नोट महत्वपूर्ण है!
इताई सेक्टर

21

चरण 1

@IBOutlet var viewTap: UIView!

चरण 2

var tapGesture = UITapGestureRecognizer()

चरण 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
}

चरण 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

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

आउटपुट

यहां छवि विवरण दर्ज करें


14

नल के इशारे को लागू करना

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

नल के पहचाने जाने पर इस फ़ंक्शन को कॉल करता है।

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

3 स्विफ्ट के लिए अद्यतन

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

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

11

स्विफ्ट 4

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

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

8

यह स्विफ्ट 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

स्विफ्ट 4 के लिए पूरा जवाब

चरण 1: दृश्य के लिए एक आउटलेट बनाएं

@IBOutlet weak var rightViewOutlet: UIView!

चरण 2: एक नल इशारा परिभाषित करें

var tapGesture = UITapGestureRecognizer()

चरण 3: ObjC फ़ंक्शन बनाएं (जब टैप किया गया हो तो देखें)

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

चरण 4: viewDidLoad के भीतर निम्नलिखित जोड़ें ()

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

चरण 2 की आवश्यकता नहीं है।
गाइड

7

स्विफ्ट 5.1 तीन दृश्य के लिए उदाहरण

चरण: 1 -> स्टोरीबोर्ड दृश्य जोड़ें और आउटलेट दृश्य जोड़ें नियंत्रक UIView

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

चरण: 2 -> स्टोरीबोर्ड दृश्य टैग जोड़ें

firstView secondView thirdView

चरण: 3 -> इशारा जोड़ें

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
    }

चरण: 4 -> दृश्य चुनें

@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

मैंने Xcode 6.4 पर तेजी से काम किया। निचे देखो।

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

यदि आप चाहते हैं कि उद्देश्य सी कोड नीचे दिया गया है,

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

या आप चाहते हैं कि स्विफ्ट कोड नीचे दिया गया है,

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 को एक लक्ष्य और कार्रवाई के साथ आरंभ करने की आवश्यकता है, जैसे:

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

फिर, आपको उस हैंडलर को लागू करना चाहिए, जो हर बार टैप इवेंट होने पर कहा जाएगा:

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

स्विफ्ट 4

सबसे पहले, UITapGestureRecognizer का एक ऑब्जेक्ट बनाएं

var tapGesture = UITapGestureRecognizer()

दूसरा कदम UITapGestureReconizer को इनिशियलाइज़ करना है। उपयोगकर्ता इंटरैक्शन सक्षम करें, फिर इसे जोड़ें।

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

तीसरा, एक विधि बनाएं

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

3

निम्नलिखित विस्तार का प्रयास करें

    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
}

और फिर इसका उपयोग करें:

submitBtn.addTapGesture {
     //your code
}

आप इसे सेल के लिए भी उपयोग कर सकते हैं

cell.addTapGesture {
     //your code
}

1
हालांकि एक कोड-ओनली उत्तर वास्तव में एक उत्तर है, थोड़ा सा स्पष्टीकरण (क्यों ओपी का कोड काम नहीं करता है, आपके कोड के पीछे सामान्य विचार क्या है, महत्वपूर्ण बिंदुओं, चेतावनियों, ...) यह एक बेहतर उत्तर बना सकता है ।
लफुरिनी

2

मैंने स्विफ्ट 2.2 पर एक्सकोड 7.3.1 पर काम किया। निचे देखो।

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()अपने को जोड़ेंviewDidLoad()
दया केविन

1

मैं दो बिंदुओं को निर्दिष्ट करना चाहता था जिससे मुझे परेशानी हो रही थी।

  • मैं init पर Gesture Recognizer बना रहा था और इसे लेट प्रॉपर्टी में स्टोर कर रहा था। जाहिरा तौर पर, इस इशारे को याद में जोड़ने से काम नहीं चलता। आईआईटी के दौरान जेस्चर पहचानकर्ता को स्व-ऑब्जेक्ट पास किया जा सकता है, ठीक से कॉन्फ़िगर नहीं किया गया है।
  • इशारा पहचानकर्ता को शून्य फ़्रेम के साथ विचारों में नहीं जोड़ा जाना चाहिए। मैं अपने सभी विचारों को शून्य फ्रेम के साथ बनाता हूं और फिर उन्हें ऑटोलेयूट का उपयोग करके आकार देता हूं। इशारा पहचानने वालों को जोड़ा जाना है कि ऑटोलैयूट इंजन द्वारा विचारों को फिर से आकार दिया गया है। इसलिए मैं viewDidAppear में जेस्चर पहचानकर्ता जोड़ता हूं और वे काम करते हैं।

1

xCode 9.3, स्विफ्ट 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 को IBAction होने की जरूरत नहीं है
Illya Krit

? iView .addGestureRecognizer (नल) अपने gestureRecognizer के नाम clickUITapGestureRecognizer तो है सही तरीका है: iView .addGestureRecognizer (clickUITapGestureRecognizer)?
ईलिया Krit

1

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

पुकारने का उद्देश्य

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

मेल उद्देश्य

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

यहाँ स्विफ्ट 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

निम्नलिखित स्विफ्ट कोड का प्रयास करें (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);
        }
      }
    }

ध्यान दें कि आपका लक्ष्य UIResponder का कोई भी उपवर्ग हो सकता है, देखें (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

MyView के UITapGestureRecognizer को लागू करने के बजाय, आप सीधे handleTapफ़ंक्शन को कॉल कर सकते हैं ,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.