วิธีการโทรด้วยท่าทางสัมผัสบน UIView โดยทางโปรแกรมด้วยความรวดเร็ว


166

ฉันมี UIView แล้วและฉันได้เพิ่มการแตะด้วยท่าทาง:

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

ฉันพยายามเรียกมันโดยทางโปรแกรมใน testfile

sendActionForEvent

ฉันใช้ฟังก์ชั่นนี้ แต่มันไม่ทำงาน:

myView.sendActionForEvent(UIEvents.touchUpDown)

มันแสดงให้เห็นตัวเลือกที่ไม่รู้จักส่งไปยังอินสแตนซ์

ฉันจะแก้ปัญหานี้ได้อย่างไร


2
ใน swift 2.2 คุณสามารถใช้ไวยากรณ์ตัวเลือกใหม่: let tap = UITapGestureRecognizer (เป้าหมาย: self, action: #selector (self.handleTap (_ :)))
Wujo

@wujo - ขอบคุณสำหรับสิ่งนั้น แปลกจริง ๆ มันใช้งานไม่ได้สำหรับฉันใน UIView บางทีในตัวควบคุมมุมมองเท่านั้น?
Fattie

2
อย่าลืมว่าimageView.userInteractionEnabled = trueถ้าคุณใช้มุมมองรูปภาพ ถูกจับได้ว่านานเกินไป
Josh

@ จอชใช่จุดสำคัญ
NeverHopeless

1
@ KhangAzun ตัวเลือกที่ดีที่สุดคือการเรียกใช้ฟังก์ชั่นการแตะโดยตรง
George

คำตอบ:


245

คุณต้องเริ่มต้นUITapGestureRecognizerด้วยเป้าหมายและการกระทำดังนี้:

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

จากนั้นคุณควรใช้ตัวจัดการซึ่งจะถูกเรียกแต่ละครั้งเมื่อมีเหตุการณ์การแตะเกิดขึ้น:

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

ดังนั้นตอนนี้การเรียกตัวจัดการเหตุการณ์ตัวจดจำท่าทางแตะของคุณจึงเป็นเรื่องง่ายเหมือนกับการเรียกวิธี:

handleTap()

แทนการเรียกฟังก์ชั่นตัวเลือกโดยตรงฉันต้องการโทรหาโดยเรียกใช้โปรแกรม UITapGestureRecognizer โดยทางโปรแกรม
George

2
@muhasturk อย่าเปลี่ยนความหมายของคำตอบ upvoted การแก้ไขของคุณทำให้คำตอบสำหรับ Swift เวอร์ชันเก่าไม่ถูกต้อง หากคุณต้องการโพสต์การอัปเดตสำหรับ Swift 2.2 ให้โพสต์คำตอบของคุณเอง ขอบคุณ.
Eric Aya

17
tap.delegate = selfไม่จำเป็นเนื่องจากคุณได้กำหนดเป้าหมายและการกระทำแล้ว
Daniel

4
โยนข้อผิดพลาดใน Swift3 ฟังก์ชันแตะที่จับของคุณควรเป็น: func handleTap (_ ผู้ส่ง: UITapGestureRecognizer)
Travis M.

ฟังก์ชั่นการโทรควร ................ func handleTap (_ ผู้ส่ง: UITapGestureRecognizer? = ไม่มี) ............... คุณพลาด "_ "........ ดังนั้นฟังก์ชั่นการโทรของคุณไม่ทำงาน ..
Prasad Patil

94

สำหรับผู้ที่กำลังมองหาโซลูชัน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
isUserInteractionEnabledจำเป็นจริงๆเหรอ? เริ่มต้นเป็นเท็จ?
jose920405

6
view.isUserInteractionEnabled = trueเป็นกุญแจสำคัญเมื่อมุมมองของคุณคือ ImageView หรือคลาสย่อยของ UIVIew แทน UIControl
Pankaj Kulkarni

61

สำหรับ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 คุณต้องระบุอย่างชัดเจนว่าฟังก์ชันที่เรียกใช้นั้นเรียกได้จาก Objective-C ดังนั้นคุณต้องเพิ่ม @objc ด้วยฟังก์ชัน handleTap ของคุณด้วย

ดูคำตอบของ@Ali Beadle ที่นี่: Swift 4 เพิ่มท่าทาง: แทนที่ vs @objc


view.isUserInteractionEnabled = trueเป็นกุญแจสำคัญเมื่อมุมมองของคุณคือ ImageView หรือคลาสย่อยของ UIVIew แทน UIControl
Pankaj Kulkarni

50

แค่ทราบ - อย่าลืมเปิดใช้งานการโต้ตอบบนมุมมอง:

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

1
หมายเหตุเป็นสิ่งสำคัญ!
Itai Spector

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

อัพเดตสำหรับสำหรับ 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

สวิฟต์ 4

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

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

8

นี่คือวิธีการทำงานใน 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

คำตอบที่สมบูรณ์สำหรับ Swift 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

Swift 5.1 ตัวอย่างสำหรับสามมุมมอง

ขั้นตอนที่ 1 -> เพิ่มมุมมองสตอรี่บอร์ดและเพิ่ม outlet viewController 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

หากคุณต้องการรหัสวัตถุประสงค์ C จะได้รับด้านล่าง

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
ในขณะที่คำตอบที่ใช้รหัสเท่านั้นเป็นคำตอบ แต่คำอธิบายเล็กน้อย (ทำไมรหัสของ OP ถึงไม่ทำงานความคิดทั่วไปที่อยู่เบื้องหลังรหัสของคุณประเด็นสำคัญคำเตือน ... ) อาจทำให้คำตอบดีขึ้นได้
lfurini

2

ฉันทำงานกับ Xcode 7.3.1 ใน Swift 2.2 ดูด้านล่าง

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

1

ฉันต้องการระบุจุดสองจุดที่ทำให้ฉันมีปัญหา

  • ฉันสร้าง Gesture Recognizer เมื่อเริ่มต้นและจัดเก็บในคุณสมบัติให้ เห็นได้ชัดว่าการเพิ่มรูปแบบลายเส้นนี้เข้ากับมุมมองไม่ทำงาน อาจเป็นวัตถุตัวเองที่ส่งผ่านไปยังตัวรู้จำท่าทางในระหว่างการเริ่มต้นไม่ได้กำหนดค่าอย่างถูกต้อง
  • ไม่ควรเพิ่มตัวจดจำท่าทางสัมผัสในมุมมองที่มีเฟรมศูนย์ ฉันสร้างมุมมองทั้งหมดของฉันด้วยศูนย์เฟรมจากนั้นปรับขนาดพวกเขาโดยใช้ออโต้เลย์เอาต์ ต้องใช้ตัวจดจำรูปแบบลายเส้นหลังจากที่มุมมองถูกปรับขนาดโดยเอ็นจิ้นอัตโนมัติ ดังนั้นฉันจึงเพิ่มตัวรู้จำท่าทางใน viewDidAppear และใช้งานได้

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 ไม่จำเป็นต้องเป็น IBAction
Illya Krit

iView? .addGestureRecognizer (แตะ) ชื่อของ gestureRecognizer ของคุณคือ clickUITapGestureRecognizer ดังนั้นวิธีที่ถูกต้องคือ: iView? .addGestureRecognizer (clickUITapGestureRecognizer)
Illya 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

นี่คือวิธีที่ง่ายที่สุดในการเพิ่มท่าทางสัมผัสในมุมมองใน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

ลองใช้รหัส swift ต่อไปนี้ (ทดสอบใน 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);
        }
      }
    }

โปรดทราบว่าเป้าหมายของคุณอาจเป็น subclass ใด ๆ ของ 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

แทนที่จะเรียกใช้ UITapGestureRecognizer ของ myView คุณสามารถเรียกใช้handleTapฟังก์ชันได้โดยตรง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.