首页 文章

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

提问于
浏览
107

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

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

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

sendActionForEvent

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

myView.sendActionForEvent(UIEvents.touchUpDown)

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

我怎么解决这个问题?

提前致谢

18 回答

  • 45

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

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    
    view.addGestureRecognizer(tap)
    
    // view.userInteractionEnabled = true
    
    self.view.addSubview(view)
    
  • 2

    我在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
    }
    
  • 1

    斯威夫特4

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchTapped(_:)))
        self.view.addGestureRecognizer(tap)
    
    @objc func touchTapped(_ sender: UITapGestureRecognizer) {
    }
    
  • 13

    如果你想要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")
        }
    }
    
  • 3

    您可以直接调用 handleTap 函数,而不是调用myView的UITapGestureRecognizer,

  • 1

    对于 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 add gesture: override vs @objc

  • 137

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

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
    tap.delegate = self // This is not required
    myView.addGestureRecognizer(tap)
    

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

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

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

    handleTap()
    
  • 16

    对于正在寻找 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")
      }
    
  • 6

    STEP : 1

    @IBOutlet var viewTap: UIView!
    

    STEP : 2

    var tapGesture = UITapGestureRecognizer()
    

    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
    }
    

    STEP : 4

    func myviewTapped(_ sender: UITapGestureRecognizer) {
    
        if self.viewTap.backgroundColor == UIColor.yellow {
            self.viewTap.backgroundColor = UIColor.green
        }else{
            self.viewTap.backgroundColor = UIColor.yellow
        }
    }
    

    OUTPUT

    enter image description here

  • 1

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

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

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

    func handleTap(sender: UITapGestureRecognizer) {
      // handling code
    }
    
  • 5

    这是它在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")
    }
    
  • 3

    实现轻击手势

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

    Update for 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")
    }
    
  • 2

    Swift 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")
                }
    
  • 0

    我在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...
    }
    
  • 40

    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) {
    
         }
    }
    
  • 76

    我想说明两点让我一直遇到问题 .

    • 我在init上创建了Gesture Recognizer并将其存储在let属性中 . 显然,将此手势识别添加到视图不起作用 . 可能是在init期间传递给手势识别器的自身对象,未正确配置 .

    • 不应将手势识别器添加到零帧的视图中 . 我使用零帧创建我的所有视图,然后使用autolayout调整它们的大小 . 必须在自动布局引擎调整视图大小之后添加手势识别器 . 所以我在viewDidAppear中添加了手势识别器,它们可以工作 .

  • 7
    let tap = UITapGestureRecognizer(target: self, action: Selector("handleFrontTap:"))
        frontView.addGestureRecognizer(tap)
    
    // Make sure this is not private
    func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
        print("tap working")
    }
    
  • 7

    尝试以下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);
            }
          }
        }
    

    请注意,您的目标可以是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!)
          }
        }
    

相关问题