如何为集合视图单元格内的视图添加手势?

Dev*_*arg 5 ios uitapgesturerecognizer uicollectionviewcell swift

我正在添加一个视图,该视图具有images(socialView)集合视图单元格内的一组视图(也具有其他视图),必须在该视图上执行公共单击。此单击不应与集合视图单元格单击相同。

我正在考虑在委托方法中添加UITapGestureRecognizerfor socialVieweverytime 。但我想知道这是正确的方法吗?此外,我想获取已被调用的索引路径/位置。CollectionViewcellForItemAtsocialView

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.socialViewTapped))

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "bidderAuctionCell", for: indexPath) as! BidderAuctionViewCell
     cell.socialView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func socialViewTapped() {
     // Which item cell's socialview is clicked
}
Run Code Online (Sandbox Code Playgroud)

更新

我已按照以下建议完成,但我无法知道应该在自定义单元格中添加 UITapGestureRecognizer 的位置。以下是我创建的自定义单元格。

class CustomViewCell: UICollectionViewCell {

    var index : IndexPath!
    var socialViewDelegate : SocialViewDelegate!

    @IBOutlet weak var socialView: UIView!

    override init(frame: CGRect) {
        super.init(frame:frame)
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:   #selector(self.viewTapped))
        socialView.addGestureRecognizer(tapGestureRecognizer)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
    }

    @objc func viewTapped(){
        socialViewDelegate.socialViewTapped(at: index)
    }
}
Run Code Online (Sandbox Code Playgroud)

未调用 init 函数。我还尝试放入必需的 init,但社交视图未初始化。所以崩溃了

最终答案

class CustomViewCell: UICollectionViewCell {

    var index : IndexPath!
    var socialViewDelegate : SocialViewDelegate!

    @IBOutlet weak var socialView: UIView!

    override func awakeFromNib() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        socialView.isUserInteractionEnabled = true
        socialView.addGestureRecognizer(tapGesture)
    }

    @objc func handleTap(){
        socialViewDelegate.socialViewTapped(at: index)
    }
}
protocol SocialViewDelegate {
    func socialViewTapped(at index: IndexPath)
}
Run Code Online (Sandbox Code Playgroud)

Let*_*ate 0

为了添加点击手势,请将以下代码添加到集合视图的单元格中。

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.socialViewTapped))
socialView?.addGestureRecognizer(tapGestureRecognizer)
socialView?.isUserInteractionEnabled = true
Run Code Online (Sandbox Code Playgroud)

将此代码添加到集合视图单元格中。