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

Ios 如何在swift中以编程方式调用UIView上的手势点击,ios,swift,iphone,ios8,uigesturerecognizer,Ios,Swift,Iphone,Ios8,Uigesturerecognizer,我有一个UIView,我在其中添加了点击手势: let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) tap.delegate = self myView.addGesture(tap) 我试图在testfile中以编程方式调用它 sendActionForEvent 我正在使用此功能,但它不起作用: myView.sendActionForEvent(UIEvents.touchUpDo

我有一个UIView,我在其中添加了点击手势:

let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
myView.addGesture(tap)
我试图在testfile中以编程方式调用它

sendActionForEvent
我正在使用此功能,但它不起作用:

myView.sendActionForEvent(UIEvents.touchUpDown)
它显示发送到实例的未识别选择器


如何解决此问题?

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

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
myView.addGestureRecognizer(tap)
let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)
然后,您应该实现处理程序,该处理程序将在每次tap事件发生时调用:

@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
    // handling code
}
func handleTap(sender: UITapGestureRecognizer) {
  // handling code
}
因此,现在调用点击手势识别器事件处理程序与调用方法一样简单:

handleTap()

尝试以下swift代码(在Xcode 6.3.1中测试):

请注意,您的目标可以是UIResponder的任何子类,请参阅(在Xcode 6.3.1中测试):


我在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
}
func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(MyViewController.handleTap))
    tap.numberOfTapsRequired = 1
    self.myView.addGestureRecognizer(tap)
}

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

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

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

实现点击手势

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "touchHappen") 
view.userInteractionEnabled = true
view.addGestureRecognizer(tap)
var tapGesture = UITapGestureRecognizer()
当识别到抽头时调用此函数

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(_:)))
yourView.addGestureRecognizer(tap)
yourView.userInteractionEnabled = true

func touchHappen(_ sender: UITapGestureRecognizer) {
    print("Hello Dear you are here")
}

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

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
myView.addGestureRecognizer(tap)
let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)
然后,您应该实现处理程序,该处理程序将在每次tap事件发生时调用:

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

如果您希望目标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")
    }
}
或者您想要的swift代码如下所示

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

我在Swift 2.2上的Xcode 7.3.1上锻炼。见下文

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
}
func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(MyViewController.handleTap))
    tap.numberOfTapsRequired = 1
    self.myView.addGestureRecognizer(tap)
}

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

您可以直接调用
handleTap
函数,而不是调用myView的UITapGestureRecognitizer,任何正在寻找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")
  }

以下是它在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")
}

步骤: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
    }
}
输出


对于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的答案:

我想指出两个一直给我带来问题的地方

  • 我在init上创建手势识别器并将其存储在let属性中。显然,将此手势记录添加到视图中不起作用。可能是在初始化过程中传递给手势识别器的自对象未正确配置
  • 不应将手势识别器添加到具有零帧的视图中。我使用零帧创建所有视图,然后使用autolayout调整它们的大小。自动布局引擎调整视图大小后,必须添加手势识别器。因此,我在ViewDidDisplay中添加了手势识别器,它们可以正常工作
Swift 4

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

@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}
代码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) {

     }
}

Swift 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

    if self.viewTap.backgroundColor == UIColor.yellow {
        self.viewTap.backgroundColor = UIColor.green
    }else{
        self.viewTap.backgroundColor = UIColor.yellow
    }
}
首先,创建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")
            }

请尝试以下扩展

扩展UIView{ func addtappostate(操作:@escaping()->Void){ 让tap=MyTapGestureRecognizer(目标:self,操作:#选择器(self.handleTap(:)) tap.action=动作 tap.numberOfTapsRequired=1 self.addgestureignizer(点击) self.isUserInteractionEnabled=true } @objc func handleTap(\发送方:MyTapGestureRecognitor){ 发件人。操作!() } } 类MyTapGestureRecognizer:UITapGestureRecognizer{ var作用:(()->Void)?=零 } 然后使用它:

submitBtn.addtaptposition{
//你的代码
}
你甚至可以用它来做手机

cell.addtappostate{
//你的代码
}

Swift 4的完整答案

func myviewTapped(_ sender: UITapGestureRecognizer) {

    if self.viewTap.backgroundColor == UIColor.yellow {
        self.viewTap.backgroundColor = UIColor.green
    }else{
        self.viewTap.backgroundColor = UIColor.yellow
    }
}
步骤1:为视图创建一个出口

@IBOutlet weak var rightViewOutlet: UIView!
步骤2:定义轻触手势

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "touchHappen") 
view.userInteractionEnabled = true
view.addGestureRecognizer(tap)
var tapGesture = UITapGestureRecognizer()
步骤3:创建ObjC函数(点击视图时调用)

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


内部视图加载

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    self.imgMainAdView.isUserInteractionEnabled = true
    self.imgMainAdView.addGestureRecognizer(tapGestureRecognizer)

通话目的

邮件用途


以下是在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")
        }
    }
}

Swift 5.1三视图示例

步骤:1->添加情节提要视图和出口视图控制器UIView

@IBOutlet var firstView: UIView!
@IBOutlet var secondView: UIView!
@IBOutlet var thirdView: UIView!
步骤:2->添加情节提要视图标记

步骤: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")
        }
    }

对于希望激活视图的任何人,请点击手势识别器,而无需直接访问手势识别器。。。当我返回到一个页面时,我必须填充以前通过轻敲填充的气泡。我一直在跟踪那些气泡标签


我不想直接调用选择器函数,而是希望通过编程方式调用UITapGestureRecognitizer来调用它event@muhasturk不要改变投票结果较高的答案的含义。您的编辑使旧Swift版本的答案无效。如果您想发布Swift 2.2的更新,请发布您自己的答案。谢谢。
tap.delegate=self
不需要,因为您已经设置了一个目标,并且操作在Swift3中引发了一个错误,您的句柄tap函数应该是:func handleTap(uu发送方:UITapGestureRecognizer)调用函数应该是…………func handleTap(u发送方:UITapGestureRecognizer?=nil)……您错过了“\uuu”……因此您的调用函数不起作用。……在swift 2.2中,您可以使用新的选择器语法:let tap=uitappesturerecognizer(target:self,action:#selector(self.handleTap(:))@wujo-谢谢;奇怪的是,它实际上对我不起作用,在UIView中可能只在视图控制器中?如果使用图像视图,还记得使用
imageView.userInteractionEnabled=true
。被发现的时间太长了。@Josh,是的,这是一个重要的问题。@KhangAzun最好的选择是在
viewDidLoad()中直接调用tap函数add
addtappiration()
,注意事项很重要<代码>iUser