Cách gọi cử chỉ chạm vào UIView lập trình nhanh chóng


165

Tôi có một UIView và tôi đã thêm cử chỉ nhấn vào nó:

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

Tôi đang cố gắng gọi nó bằng lập trình trong testfile.

sendActionForEvent

Tôi đang sử dụng chức năng này, nhưng nó không hoạt động:

myView.sendActionForEvent(UIEvents.touchUpDown)

Nó cho thấy bộ chọn không được nhận dạng được gửi đến ví dụ.

Làm thế nào tôi có thể giải quyết vấn đề này?


2
Trong swift 2.2, bạn có thể sử dụng cú pháp bộ chọn mới: let tap = UITapGestureRecognizer (đích: self, action: #selector (self.handleTap (_ :)))
Wujo

@wujo - cảm ơn vì điều đó; kỳ lạ là nó không thực sự hoạt động với tôi, trong một UIView Có lẽ chỉ trong một bộ điều khiển xem?
Fattie

2
Cũng nhớ có imageView.userInteractionEnabled = truenếu bạn đang sử dụng chế độ xem hình ảnh. Bị bắt vì điều đó quá lâu.
Josh

@Josh, vâng, một điểm quan trọng.
NeverHopless

1
@KhangAzun tùy chọn tốt nhất là gọi trực tiếp chức năng nhấn
George

Câu trả lời:


244

Bạn cần khởi tạo UITapGestureRecognizervới một mục tiêu và hành động, như vậy:

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

Sau đó, bạn nên triển khai trình xử lý, sẽ được gọi mỗi lần khi xảy ra sự kiện nhấn:

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

Vì vậy, bây giờ gọi trình xử lý sự kiện nhận dạng cử chỉ nhấn của bạn dễ dàng như gọi một phương thức:

handleTap()

thay vì gọi chức năng chọn trực tiếp, tôi muốn gọi nó bằng cách lập trình gọi sự kiện UITapGestureRecognizer
George

2
@muhasturk Đừng thay đổi ý nghĩa của câu trả lời nâng cao. Chỉnh sửa của bạn đã vô hiệu hóa câu trả lời cho các phiên bản Swift cũ hơn. Nếu bạn muốn đăng cập nhật cho Swift 2.2, hãy đăng câu trả lời của riêng bạn. Cảm ơn bạn.
Eric Aya

17
tap.delegate = selflà không cần thiết, vì bạn đã đặt mục tiêu và hành động
Daniel

4
Ném lỗi trong Swift3, chức năng nhấn tay cầm của bạn phải là: func handleTap (_ sender: UITapGestureRecognizer)
Travis M.

Chức năng gọi phải là ................ func handleTap (_ sender: UITapGestureRecognizer? = Nil) ............... bạn đã bỏ lỡ "_ "........ vì vậy chức năng gọi điện của bạn không hoạt động ..
Prasad Patil

94

Đối với bất cứ ai đang tìm kiếm giải pháp 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
isUserInteractionEnabledcó thực sự cần thiết? Mặc định này sai?
jose920405

6
view.isUserInteractionEnabled = truelà chìa khóa khi chế độ xem của bạn là ImageView hoặc bất kỳ lớp con nào của UIVIew thay vì UIControl.
Pankaj Kulkarni

61

Dành cho 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")
}

Trong Swift 4, bạn cần chỉ rõ một cách rõ ràng rằng hàm được kích hoạt có thể gọi được từ Objective-C, vì vậy bạn cần thêm @objc vào hàm xử lý của bạn.

Xem câu trả lời của @Ali Beadle tại đây: Swift 4 thêm cử chỉ: ghi đè so với @objc


view.isUserInteractionEnabled = truelà chìa khóa khi chế độ xem của bạn là ImageView hoặc bất kỳ lớp con nào của UIVIew thay vì UIControl.
Pankaj Kulkarni

50

Chỉ cần một lưu ý - Đừng quên bật tương tác trên chế độ xem:

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

1
Các lưu ý là quan trọng!
Itai Spector

21

BƯỚC 1

@IBOutlet var viewTap: UIView!

BƯỚC 2

var tapGesture = UITapGestureRecognizer()

BƯỚC 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
}

BƯỚC 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

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

ĐẦU RA

nhập mô tả hình ảnh ở đây


14

Thực hiện cử chỉ nhấn

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

Gọi chức năng này khi vòi được nhận ra.

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

Cập nhật cho 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

Swift 4

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

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

8

Đây là cách nó hoạt động trong 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

Câu trả lời hoàn chỉnh cho Swift 4

Bước 1: tạo một lối thoát cho khung nhìn

@IBOutlet weak var rightViewOutlet: UIView!

Bước 2: xác định cử chỉ nhấn

var tapGesture = UITapGestureRecognizer()

Bước 3: tạo chức năng ObjC (được gọi khi chế độ xem)

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

Bước 4: thêm các mục sau trong viewDidLoad ()

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

Bước 2 là không bắt buộc.
guido

7

Swift 5.1 Ví dụ cho ba chế độ xem

Bước: 1 -> Thêm chế độ xem bảng phân cảnh và thêm chế độ xem ổ cắm Trình điều khiển UIView

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

Bước: 2 -> Thêm câu chuyện Thẻ xem

Lần đầu tiên xem xem thứ hai thứ ba

Bước: 3 -> Thêm cử chỉ

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
    }

Bước: 4 -> chọn xem

@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

Tôi đã làm việc trên Xcode 6.4 trên swift. Xem bên dưới.

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

Nếu bạn muốn mã Objective C được đưa ra dưới đây,

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

hoặc bạn muốn mã nhanh chóng được đưa ra dưới đây,

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

Bạn cần khởi tạo UITapGestureRecognizer với một mục tiêu và hành động, như vậy:

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

Sau đó, bạn nên triển khai trình xử lý, sẽ được gọi mỗi lần khi xảy ra sự kiện nhấn:

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

Swift 4

Đầu tiên, tạo một đối tượng của UITapGestureRecognizer

var tapGesture = UITapGestureRecognizer()

Bước thứ hai là khởi tạo UITapGestureReconizer. Cho phép tương tác người dùng, sau đó thêm nó.

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

Thứ ba, tạo một phương thức

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

3

thử phần mở rộng sau

    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
}

và sau đó sử dụng nó:

submitBtn.addTapGesture {
     //your code
}

bạn thậm chí có thể sử dụng nó cho tế bào

cell.addTapGesture {
     //your code
}

1
Mặc dù câu trả lời chỉ có mã thực sự là một câu trả lời, một chút giải thích (tại sao mã của OP không hoạt động, ý tưởng chung đằng sau mã của bạn, những điểm quan trọng, cảnh báo, ...) có thể khiến nó trở thành câu trả lời tốt hơn .
lfurini

2

Tôi đã làm việc trên Xcode 7.3.1 trên Swift 2.2. Xem bên dưới.

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

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

1
thêm addTapGesture()vào của bạnviewDidLoad()
Daya Kevin

1

Tôi muốn chỉ định hai điểm khiến tôi gặp vấn đề.

  • Tôi đã tạo Trình nhận dạng cử chỉ trên init và lưu trữ nó trong thuộc tính let. Rõ ràng, việc thêm recog cử chỉ này vào chế độ xem không hoạt động. Có thể là đối tượng tự chuyển đến bộ nhận dạng cử chỉ trong init, không được cấu hình đúng.
  • Không nên thêm trình nhận dạng cử chỉ vào chế độ xem với khung không. Tôi tạo tất cả các chế độ xem của mình với khung không và sau đó thay đổi kích thước chúng bằng cách sử dụng tự động thanh toán. Các nhận dạng cử chỉ phải được thêm SAU KHI các chế độ xem đã được thay đổi kích thước bởi công cụ tự động thanh toán. Vì vậy, tôi thêm trình nhận dạng cử chỉ trong viewDidAppear và chúng hoạt động.

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

     }
}

Chức năng trên Chọn không cần phải là IBAction
Illya Krit

? iView .addGestureRecognizer (tap) Tên của gestureRecognizer của bạn là clickUITapGestureRecognizer Vì vậy, một cách đúng đắn là: iView .addGestureRecognizer (clickUITapGestureRecognizer)?
Illya Krit

1

Bên trong 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: [:])
    }
}

Gọi mục đích

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

Mục đích thư

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

Đây là cách đơn giản nhất để thêm Cử chỉ trên Chế độ xem trong 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

Hãy thử mã nhanh chóng sau đây (được thử nghiệm trong 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);
        }
      }
    }

Lưu ý rằng mục tiêu của bạn có thể là bất kỳ lớp con nào của UIResponder, xem (được thử nghiệm trong 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

Thay vì gọi UITapGestureRecognizer của myView, bạn có thể gọi handleTaphàm trực tiếp ,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.