Swift 4 - 给子视图图片添加UITapGestureRecognizer - 方法未被调用

15
我已经设置了如下的UITapGestureRecognizer,但是方法没有被调用?
请注意:UITapGestureRecognizer 被添加到了一个子视图项中。
此外,在SUStepView本身中添加UIGestureRecognizerDelegate时它是有效的——唯一的问题是我需要它在容器中。
class StepViewContainer: NSObject, UIGestureRecognizerDelegate {
var view: SUStepView?

    @objc func tapAction(recognizer: UITapGestureRecognizer) {

    }

    override init(){
        super.init()
        // View
        self.view = Bundle.main.loadNibNamed("SignupV3Views", owner: self, options: nil)![0] as? SUStepView

        let mytapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapAction))
        mytapGestureRecognizer.numberOfTapsRequired = 1
        self.view?.imageView.addGestureRecognizer(mytapGestureRecognizer)            
    }
}

StepViewContainer 中的视图:

class SUStepView: UIView {
@IBOutlet weak var imageView: UIImageView!

    @objc public func nextStepTap(sender: UITapGestureRecognizer) {
    }

    override func awakeFromNib() {
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(nextStepTap))
        tapGestureRecognizer.numberOfTapsRequired = 1
        self.imageView.addGestureRecognizer(tapGestureRecognizer)

        self.imageView.isUserInteractionEnabled = true
        self.imageView.layer.masksToBounds = true
        self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
        self.imageView.clipsToBounds = true

}

为什么你不直接使用imageView而是用self.view?.imageView - Anbu.Karthik
我有一个容器(self),用于处理不同的事件。 - Chris G.
2
你是否在 imageView 上设置了 userInteractionEnabled = true? - Eridana
好的建议,但是是的。 - Chris G.
1
好的。那么可能是选择器没有被调用。尝试使用 #selector(YourControllerName.nextStepTap)。或者是 imageView / self.view? 为空。我无法提供其他原因,抱歉。希望你能找到原因。 - Eridana
显示剩余2条评论
2个回答

26

Swift 4 代码:

TapGesture:

 tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.myviewTapped(_:)))
 tapGesture.numberOfTapsRequired = 1
 tapGesture.numberOfTouchesRequired = 1

图像视图点击:

    self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width/2.0, height: self.view.frame.size.height/2.0))
    self.imageView.isUserInteractionEnabled = true
    self.imageView.backgroundColor = UIColor.red
    self.imageView.layer.masksToBounds = true
    self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
    self.imageView.clipsToBounds = true
    self.imageView.isUserInteractionEnabled = true
    self.imageView.addGestureRecognizer(tapGesture)
    self.view.addSubview(self.imageView)

轻点呼叫

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

3
为什么我必须在函数前面添加@objc - Henrik R
6
因为在 Swift 4 中,函数不再隐式地暴露给 Objective-C 代码,而这是需要作为选择器调用函数的前提条件。 - Kevin R
1
只需设置 imageView.isUserInteractionEnabled = true 就解决了我的问题。 - Nicholas Allio

12

试一试。

let mytapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(myTapAction))
mytapGestureRecognizer.numberOfTapsRequired = 1
self.imageView.addGestureRecognizer(mytapGestureRecognizer)

方法。

@objc func myTapAction(recognizer: UITapGestureRecognizer) {
}

2
应该在选择器方法中添加 @objc。 - Lal Krishna
1
默认情况下,numberOfTapsRequired的值为1。 - Ilya Muradymov

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