将tapGestureRecognizer添加到其backgroundview时,无法触发collectionview事件

时间:2015-12-02 04:32:28

标签: ios swift uicollectionview uitapgesturerecognizer

  1. 将视图集添加到视图中将视图添加到

  2. backgroundview(UIView)

  3. 将tapGestureRecognizer添加到backgroundView
  4. 点击一个单元格时无法触发collectionview的select事件,它总是触发backgroundview的点击事件

    let backgroundView = UIView(frame: sender.window!.bounds)
        backgroundView.backgroundColor = UIColor.yellowColor()
    
        let blueView = BlueView(frame: CGRect(x: 300, y: 200, width: 300, height: 400))
        backgroundView.addSubview(blueView)
        sender.window!.addSubview(backgroundView)
        backgroundView.userInteractionEnabled = true
    
        let gesture = UITapGestureRecognizer(target: blueView, action: "tapGestureRecognizer")
        gesture.delegate = blueView
        backgroundView.addGestureRecognizer(gesture)
    

    ..........

        let cv = UICollectionView(frame: CGRect(x: 100, y: 0, width: 100, height: 340), collectionViewLayout: layout)
        cv.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
        cv.dataSource = self
    
        blueView.addSubview(cv)
    

    谁知道原因?

2 个答案:

答案 0 :(得分:1)

问题是,向UIGestureRecognzer添加superview也会影响其subview中的触摸事件。为避免这种情况,您需要实现UIGestureRecognzer的以下委托方法,并通过返回UIGestureRecogniser来取消false的触摸操作。

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool
{
    var view = gestureRecognizer.view
    if view.tag != 100 //Set a tag for the backgroundview
    {
        return false
    }
    return true
}

修改

查看代码,我怀疑你没有设置UICollectionView的委托。您刚刚设置了DataSourcedidselect方法是委托方法,而不是dataSource。请尝试在下方添加以下内容,然后设置UICollectionView的{​​{1}}:

dataSource

答案 1 :(得分:0)

我认为你回答了你的问题。

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)

它是来自UICollectionView的委托方法,所以当您在单元格中使用识别器创建UIView时,它会接受触摸并且不会通过它们,因此集合视图赢了&# 39; t调用其委托方法。

如果您想要可能的解决方案,有很多:

1)如果您的单元格中只需要自定义逻辑,当有人单击单元格时,您可以覆盖单元格内的selected并在此处添加逻辑:

class Cell: UICollectionViewCell {
    override var selected: Bool {
        didSet {

        }
    }
}

2)您可以创建从点击识别器选择器或通知中调用的委托方法:

func tapGestureRecognizer() {
    NSNotificationCenter.defaultCenter().postNotificationName("TappedRecognizer", object: nil)
}

class YourController: UIViewController {

    override func viewDidLoad() {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "tappedRecognizer", name: "TappedRecognizer", object: nil)
    }

    func tappedRecognizer() {
        // your code here
    }
}

3)我认为可以通过您的视图将您的触摸传递给单元格,因此它会调用UICollectionView的委托方法,然后您应该覆盖pointInside的{​​{1}}方法,可以搜索关于此主题的大量代码,例如this