如何在Swift中以编程方式调用UIView上的手势轻敲

227

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

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

我正试图在测试文件中以编程方式进行调用。

sendActionForEvent

我正在使用这个函数,但它不起作用:

myView.sendActionForEvent(UIEvents.touchUpDown)

出现了未识别的选择器被发送到实例。

我该如何解决这个问题?


3
在 Swift 2.2 中,你可以使用新的选择器语法:let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))。 - Wujo
@wujo - 感谢你的回复;奇怪的是,在 UIView 中对我并没有实际作用。或许只能在视图控制器中使用? - Fattie
2
还要记得在使用图像视图时设置 imageView.userInteractionEnabled = true。我曾经因为这个问题卡了很久。 - Josh
@Josh,是的,非常重要的一点。 - NeverHopeless
@George,你找到解决方案了吗?我和你一样有同样的问题。但我的目的是为了单元测试,在那里我想触发视图上的点击。谢谢。 - azun
1
@KhangAzun 最好的选择是直接调用tap函数。 - George
24个回答

1

我想指出两个一直困扰我的问题。

  • 我在init时创建手势识别器并将其存储在let属性中。显然,将此手势识别器添加到视图中不起作用。可能是在init期间传递给手势识别器的self对象未正确配置。
  • 手势识别器不应添加到零框架的视图上。我使用零框架创建所有视图,然后使用自动布局调整它们的大小。手势识别器必须在视图被自动布局引擎调整大小之后添加。所以我在viewDidAppear中添加手势识别器,它们就可以工作了。

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

0

对于任何想要激活视图轻拍手势识别器但没有直接访问手势识别器的人...当返回到一个页面时,我必须填写之前通过轻拍填充的气泡。我跟踪了这些气泡标签(bubs)...

func fillBubs(bubs: [Int]) {
    for bub in bubs {
        let bubble = view.viewWithTag(bub)
        if bubble == nil {continue}
        for g in bubble!.gestureRecognizers! {
            let tap = g as! UITapGestureRecognizer
            handleBub(tap)
        }
    }
}

@objc func handleBub(_ sender: UITapGestureRecognizer? = nil) {
    let bubble = sender?.view!
    bubble?.layer.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
}



0

不必调用myView的UITapGestureRecognizer,您可以直接调用handleTap函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接