프로그래밍 방식으로 UIView에서 제스처 탭을 신속하게 호출하는 방법


166

UIView가 있고 탭 제스처를 추가했습니다.

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

테스트 파일에서 프로그래밍 방식으로 호출하려고합니다.

sendActionForEvent

이 기능을 사용하고 있지만 작동하지 않습니다.

myView.sendActionForEvent(UIEvents.touchUpDown)

인식되지 않은 선택기가 인스턴스로 전송되었음을 보여줍니다.

이 문제를 어떻게 해결할 수 있습니까?


2
신속한 2.2에서는 새로운 선택기 구문을 사용할 수 있습니다 : let tap = UITapGestureRecognizer (target : 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 answer의 의미를 바꾸지 마십시오. 귀하의 수정 사항이 이전 Swift 버전에 대한 답변을 무효화했습니다. Swift 2.2에 대한 업데이트를 게시하려면 자신의 답변을 게시하십시오. 감사합니다.
Eric Aya

17
tap.delegate = self이미 목표와 행동을 설정했기 때문에 필요하지 않습니다
Daniel

4
Swift3에서 오류가 발생하면 핸들 탭 기능은 다음과 같아야합니다. func handleTap (_ sender : UITapGestureRecognizer)
Travis M.

호출 기능은 ....... func handleTap (_ sender : UITapGestureRecognizer? = nil)이어야합니다. "........ 그래서 호출 기능이 작동하지 않았습니다 ..
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정말 필요한가요? 디폴트는 false?
jose920405

6
view.isUserInteractionEnabled = true뷰가 ImageView 또는 UIControl 대신 UIVIew의 하위 클래스 인 경우의 키입니다.
카지 Kulkarni

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

Swift 4에서는 트리거 된 함수가 Objective-C에서 호출 가능함을 명시 적으로 표시해야하므로 handleTap 함수도 @objc를 추가해야합니다.

@Ali Beadle의 답변보기 : Swift 4 제스처 추가 : override vs @objc


view.isUserInteractionEnabled = true뷰가 ImageView 또는 UIControl 대신 UIVIew의 하위 클래스 인 경우의 키입니다.
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)
}

스위프트 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 단계는 필요하지 않습니다.
guido

7

Swift 5.1 세 가지보기의 예

1 단계 : -스토리 보드보기 추가 및 콘센트보기 추가

@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

Objective 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

Swift 2.2에서 Xcode 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를 만들어 let 속성에 저장했습니다. 분명히이 제스처 녹음을보기에 추가해도 작동하지 않습니다. 초기화하는 동안 제스처 인식기에 자기 객체가 전달 될 수 있습니다. 제대로 구성되지 않았습니다.
  • 프레임이없는 뷰에는 제스처 인식기를 추가하지 않아야합니다. 프레임이없는 모든 뷰를 만든 다음 자동 레이아웃을 사용하여 크기를 조정합니다. 자동 레이아웃 엔진으로 뷰의 크기를 조정 한 후에는 제스처 인식기를 추가해야합니다. 그래서 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 (tap) 제스처 인식기의 이름은 clickUITapGestureRecognizer입니다. 올바른 방법은 다음과 같습니다. iView? .addGestureRecognizer (clickUITapGestureRecognizer)
Illya Krit

1

내부 뷰

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

다음 빠른 코드를 사용해보십시오 (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함수를 직접 호출 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.