27687


UIViewに

①UICollectionviewをaddSubviewして、

②UITapGestureRecognaizerをaddGestureRecognizerしている

状態で、

collectionViewのセルのタップに失敗した（特定のセルがタップされなかったなど）場合に  
②のtapが反応するようにしたいです。

上の状態だと、②が先に反応してしまいます。

* * *

ご回答ありがとうございます。

下のように記述すると、  
なぜだか、viewのどこをタップしても、pointの値が一定になります。

[code]

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer,shouldReceiveTouch touch: UITouch) -> Bool {
    
    
            let point = gestureRecognizer.locationInView(gestureRecognizer.view)
            let convertLocation = gestureRecognizer.view!.convertPoint(point, toView: currentCardView!.cv)
            let indexPath = currentCardView!.cv.indexPathForItemAtPoint(convertLocation)
            if indexPath != nil {
                return false
            }
            return true
        }
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/RQWeQ.png)](https://i.stack.imgur.com/RQWeQ.png)


CC BY-SA 3.0
2016-07-17T11:26:05.150
27683
2016-07-17T14:45:27.490
2016-07-17T14:45:27.490
12297
12297
question
swift xcode
UICollectionviewのセルのタップを優先させたい。


`UIGestureRecognizerDelegate`を実装して以下のような判定を行います。

Swift3の記述ですが、Swift2でもデリゲートメソッドの体裁以外は特に変わりません。

[code]

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if self.collectionView?.indexPathForItem(at: touch.location(in: self.collectionView)) != nil {
            return false
        }
    
        return true
    }
    
[/code]

`GestureRecognaizer`のタッチ座標から、`UICollectionView`の`indexPath`を取得します。

取得できた場合、どこかのセルの座標なので、`false`を返します。これにより、`UICollectionViewCell`のタップイベントが優先して実行されます。

`nil`が返却された場合は、セルのない座標なので`true`を返却して`GestureRecognaizer`のイベントを実行します。


CC BY-SA 3.0
2016-07-17T13:31:20.760
27687
2016-07-17T13:31:20.760
5337
27683
answer