将视图集添加到视图中将视图添加到
backgroundview(UIView)
点击一个单元格时无法触发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)
谁知道原因?
答案 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
的委托。您刚刚设置了DataSource
。 didselect
方法是委托方法,而不是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