如何在swift中以编程方式调用手势点击UIView

Geo*_*rge 142 iphone uigesturerecognizer ios swift ios8

我有一个UIView,并且我已添加了点击手势:

let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
myView.addGesture(tap)
Run Code Online (Sandbox Code Playgroud)

我试图在testfile中以编程方式调用它.

sendActionForEvent
Run Code Online (Sandbox Code Playgroud)

我正在使用此功能,但它无法正常工作:

myView.sendActionForEvent(UIEvents.touchUpDown)
Run Code Online (Sandbox Code Playgroud)

它显示发送到实例的无法识别的选择器.

我怎么解决这个问题?

提前致谢

Sal*_*nov 195

您需要UITapGestureRecognizer使用目标和操作进行初始化,如下所示:

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
myView.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)

然后,您应该实现处理程序,每次发生tap事件时都会调用该处理程序:

@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
    // handling code
}
Run Code Online (Sandbox Code Playgroud)

因此,现在调用您的tap手势识别器事件处理程序就像调用方法一样简单:

handleTap()
Run Code Online (Sandbox Code Playgroud)

  • 因为您已经设置了目标和操作,所以不需要"tap.delegate = self" (15认同)
  • 在Swift3中引发错误,你的手柄点击功能应该是:func handleTap(_ sender:UITapGestureRecognizer) (4认同)
  • @muhasturk不要改变upvoted答案的含义.您的编辑使旧Swift版本的答案无效.如果您想发布Swift 2.2的更新,请发布您自己的答案.谢谢. (2认同)

Joh*_*Lim 89

对于任何正在寻找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")
  }
Run Code Online (Sandbox Code Playgroud)

  • 当您的视图是 ImageView 或 UIVIew 的任何子类而不是 UIControl 时,`view.isUserInteractionEnabled = true` 是关键。 (7认同)

RNH*_*TTR 57

对于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")
}
Run Code Online (Sandbox Code Playgroud)

在Swift 4中,你需要明确指出触发函数可以从Objective-C调用,所以你需要添加@objc你的handleTap函数.

请参阅@Ali Beadle的回答:Swift 4添加手势:覆盖vs @objc


小智 50

只需注意 - 不要忘记在视图上启用交互:

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)
Run Code Online (Sandbox Code Playgroud)


Kir*_*odi 19

步骤1

@IBOutlet var viewTap: UIView!
Run Code Online (Sandbox Code Playgroud)

第2步

var tapGesture = UITapGestureRecognizer()
Run Code Online (Sandbox Code Playgroud)

STEP: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
}
Run Code Online (Sandbox Code Playgroud)

第4步

func myviewTapped(_ sender: UITapGestureRecognizer) {

    if self.viewTap.backgroundColor == UIColor.yellow {
        self.viewTap.backgroundColor = UIColor.green
    }else{
        self.viewTap.backgroundColor = UIColor.yellow
    }
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

在此输入图像描述


ikb*_*bal 15

Swift 5.1 三视图示例

步骤:1 -> 添加故事板视图并添加插座 viewController UIView

@IBOutlet var firstView: UIView!
@IBOutlet var secondView: UIView!
@IBOutlet var thirdView: UIView!
Run Code Online (Sandbox Code Playgroud)

步骤:2 -> 添加 storyBoard 视图标签

第一视图 第二视图 第三视图

步骤: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
    }
Run Code Online (Sandbox Code Playgroud)

步骤: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")
        }
    }
Run Code Online (Sandbox Code Playgroud)


Mus*_*ari 14

实现轻击手势

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "touchHappen") 
view.userInteractionEnabled = true
view.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)

识别出水龙头时调用此功能.

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

For Swift 3的更新

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

func touchHappen(_ sender: UITapGestureRecognizer) {
    print("Hello Museer")
}
Run Code Online (Sandbox Code Playgroud)


Gia*_*ang 10

斯威夫特4

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

@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}
Run Code Online (Sandbox Code Playgroud)


小智 9

尝试以下扩展

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
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

submitBtn.addTapGesture {
     //your code
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以将它用于手机

cell.addTapGesture {
     //your code
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然仅代码答案确实是一个答案,但一些解释(为什么OP的代码不起作用,代码背后的一般思想是什么,要点,警告......)可以使它成为一个*更好的*答案。 (3认同)

小智 7

这是它在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")
}
Run Code Online (Sandbox Code Playgroud)


swi*_*Boy 7

这是在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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


A.G*_*A.G 6

我在swift上研究了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
}
Run Code Online (Sandbox Code Playgroud)


小智 6

Swift 4的完整答案

步骤1:为视图创建出口

@IBOutlet weak var rightViewOutlet: UIView!
Run Code Online (Sandbox Code Playgroud)

步骤2:定义轻击手势

var tapGesture = UITapGestureRecognizer()
Run Code Online (Sandbox Code Playgroud)

步骤3:创建ObjC函数(在点击视图时调用)

@objc func rightViewTapped(_ recognizer: UIGestureRecognizer) {
    print("Right button is tapped")
}
Run Code Online (Sandbox Code Playgroud)

步骤4:在viewDidLoad()中添加以下内容

let rightTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.rightViewTapped(_:)))
    rightViewOutlet.addGestureRecognizer(rightTap)
Run Code Online (Sandbox Code Playgroud)


小智 5

您需要使用目标和操作初始化UITapGestureRecognizer,如下所示:

let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)

然后,您应该实现处理程序,每次发生tap事件时都会调用该处理程序:

func handleTap(sender: UITapGestureRecognizer) {
  // handling code
}
Run Code Online (Sandbox Code Playgroud)


Iyy*_*avi 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");
}
Run Code Online (Sandbox Code Playgroud)

或者您想在下面给出快速代码,

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")
    }
}
Run Code Online (Sandbox Code Playgroud)