如何使用 swift 为 UITapGestureRecognizer 编写通用方法

How to write a generic method for UITapGestureRecognizer using swift

我必须为标签和 ImageView 添加 tapGesture。如何为 Labels 和 ImageView 创建通用的点击手势方法?

//TapGestureHandler
extension EditViewController : UIGestureRecognizerDelegate
{
 //Add Gesture on ImageView
 func addGesture()
 {
    //Gesture Male
    let maleTapGesture = UITapGestureRecognizer(target: self, action: #selector(maleGestureTap))
    maleTapGesture.delegate = self
    imgViewMale.addGestureRecognizer(maleTapGesture)

    //GestureFemale
    let FemaleTapGesture = UITapGestureRecognizer(target: self, action: #selector(femaleGestureTap))
    FemaleTapGesture.delegate = self
    imgViewFemale.addGestureRecognizer(FemaleTapGesture)

    //Gesture MaleFemale
    let maleFeTapGesture = UITapGestureRecognizer(target: self, action: #selector(maleFeGestureTap))
    maleFeTapGesture.delegate = self
    imgViewMaleFe.addGestureRecognizer(maleFeTapGesture)
 }

 //Tap Gesture Male
 func maleGestureTap()
 {
    imgViewMale.backgroundColor = hexStringToUIColor(hex: "#CBFFE2")
 }

 //Tap Gesture Female
 func femaleGestureTap()
 {
    imgViewFemale.backgroundColor = hexStringToUIColor(hex: "#CBFFE2")
 }

 //Tap Gesture MaleFemale
 func maleFeGestureTap()
 {
    imgViewMaleFe.backgroundColor = hexStringToUIColor(hex: "#CBFFE2")
 }
}

我不知道我们如何编写泛型方法。

定义目标 selector(tapGestureHandler:) 参数为

let tap = UITapGestureRecognizer(target: self, action: Selector("tapGestureHandler:"))

然后像这样检查你的组件。

func tapGestureHandler(_ sender: UITapGestureRecognizer) {

     if sender.view is UIView {
     // sender is a UIView 
     }
     else if sender.view is UIImageView{
    // sender is UIimageView
     }
     else{
     // sender is none
     }
}

并确保 user interaction is true.

你可以这样做:

假设您有一些对象需要附加点击处理程序,假设它们都符合 UIView 协议:

let subviews: [Any] = [label1, label2, label3, view1, imageview1]()
label1.tag = 1 //** add a tag to your object **
for v in subviews {
   self.addTapGesture(to: v)
}

 func tapped(_ sender: UITapGestureRecognizer) {
    print("tapped")
    if sender.view?.tag == 1 {
        // *** this is your label1 view ***
    }
}

func addTapGesture(to: Any?) {
    if let v = to as? UIView {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapped(_:)))
        v.addGestureRecognizer(tapGesture)
        v.isUserInteractionEnabled = true
    }
}