Swift-如何向UIViews数组添加点击手势?

时间:2019-01-21 14:57:15

标签: ios swift uitapgesturerecognizer

试图向UIView数组添加轻击手势-失败。在此阶段似乎无法识别出点击。

在下面的代码(摘录)中: 主视图上显示一系列PlayingCardViews(每个UIView)。 集合为一个数组:cardView。 需要能够独立点击每个PlayingCardView(然后才能识别出被点击的那个)。

@IBOutlet private var cardView: [PlayingCardView]!


override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(tapCard(sender: )))
    for index in cardView.indices {
        cardView[index].isUserInteractionEnabled = true
        cardView[index].addGestureRecognizer(tap)
        cardView[index].tag = index
    }
}

@objc func tapCard (sender: UITapGestureRecognizer) {
    if sender.state == .ended {
        let cardNumber = sender.view.tag
        print("View tapped !")
    }
}

4 个答案:

答案 0 :(得分:1)

您需要

@objc func tapCard (sender: UITapGestureRecognizer) { 
     let clickedView = cardView[sender.view!.tag] 
     print("View tapped !" , clickedView ) 
}

这里不需要检查状态,因为这种手势类型的方法仅被调用一次,每个视图都应有一个单独的点击,因此可以在for-循环内创建它

for index in cardView.indices  { 
   let tap = UITapGestureRecognizer(target: self, action: #selector(tapCard(sender: )))

答案 1 :(得分:0)

let tap = UITapGestureRecognizer(target: self, action: #selector(didTapCard(sender: )))
    for (index, view) in cardView.enumerated() {
        view.isUserInteractionEnabled = true
        view.addGestureRecognizer(tap)
        view.tag = index
    }

然后在您的didTapCard函数中,您需要检查标签。

答案 2 :(得分:0)

您可以尝试将视图控制器作为参数传递给视图,以便它们可以从视图中调用父视图控制器上的函数。要减少内存,您可以使用协议。 e.x

    protocol testViewControllerDelegate: class {
        func viewTapped(view: UIView)
    }

    class testClass: testViewControllerDelegate {

    @IBOutlet private var cardView: [PlayingCardView]!


    override func viewDidLoad() {
        super.viewDidLoad()
        for cardView in self.cardView {
            cardView.fatherVC = self
        }

        }

        func viewTapped(view: UIView) {
            // the view that tapped is passed ass parameter
        }
    }




    class PlayingCardView: UIView {

        var fatherVC: testViewControllerDelegate?
        override func awakeFromNib() {
            super.awakeFromNib()
            let gr = UITapGestureRecognizer(target: self, action: #selector(self.viewDidTap))
self.addGestureRecognizer(gr)
        }

        @objc func viewDidTap() {
            fatherVC?.viewTapped(view: self)
        }
    }

答案 3 :(得分:0)

我不会推荐所选答案。因为在循环中,创建tapGesture数组对我没有意义。最好在PlaycardView中添加手势。

相反,应使用UICollectionView设计此类布局。如果需要自定义布局,并且想使用scrollView甚至UIView,那么更好的方法是创建单个Gesture Recognizer并将其添加到超级视图。

使用点击手势,您可以获取点击位置,然后可以使用该位置获取selectedView。

请参考以下示例:

new Vue({
  el: '#app',
  data() {
    return {
      item: null,
      items: [
        {
          text: "a"
        },
        {
          text: "b"
        },
        {
          text: "c"
        },
      ]
    }
  }
})