54497


今、collectionViewのcellの外をタップしたときに画面遷移したいのですがcollectionViewCellの外側というのを判定することができません。  
下の写真の黄色い部分です。[![画像の説明をここに入力](https://i.stack.imgur.com/czy27.jpg)](https://i.stack.imgur.com/czy27.jpg)

画面遷移のコードは

[code]

            outsideCell.gestureRecognizers = [UITapGestureRecognizer(target: self, action: #selector(self.outsideTouch(_:)))]
    
[/code]

教えていただけないでしょうか。


CC BY-SA 4.0
2019-04-24T08:24:18.020
54452
2019-04-26T07:42:05.397
32274
question
swift ios swift4 swift5
cellの外側を確立することはできるのか


Collection
Viewのセルをタップしたかどうかは、`UICollectionViewDelegate`プロトコルの`collectionView(_
collectionView: UICollectionView, didSelectItemAt indexPath:
IndexPath)`メソッドで知ることができます。そしてCollection
Viewは`UIView`のサブクラスですから、`UITapGestureRecognizer`を`add`して、タップを検知することができます。ここまでは、質問者さんには既知のことと思います。  
そして、プログラミングには、数学の集合の概念、否定（NOT）、論理和（OR）、論理積（AND）が必須であることも既知のことと思います。「Collection
Viewをタップした」という命題と、「セルをタップした」という命題を使い、否定と論理積を組みわせて、「Collection
Viewがタップされ、かつセルがタップされていない」、すなわち「セルの外側がタップされた」を知ることができます。

Collection Viewのインスタンスを`collectionView`とすると、`UITapGestureRecognizer`の組み込みは、

[code]

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) // セレクタのメソッド名は、任意で。
    tapGestureRecognizer.cancelsTouchesInView = false
    collectionView.addGestureRecognizer(tapGestureRecognizer)
    
[/code]

ただ`UITapGestureRecognizer`を組み込むだけだと、セルのタップがブロックされてしまうので、2行目`tapGestureRecognizer.cancelsTouchesInView
= false`で、そのブロックをキャンセルしておきます。


CC BY-SA 4.0
2019-04-25T02:10:10.687
54463
2019-04-25T02:10:10.687
18540
54452
answer


UICollectionView で表示してる cell の外側をタップされた時にコードを実行したいということでしたら、UICollectionView の
backgroundView に UITapGestureRecognizer を追加した UIView を追加してください。

[code]

    import UIKit
    
    final class ViewController: UIViewController {
    
        @IBOutlet private weak var collectionView: UICollectionView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let view = UIView(frame: .zero)
            let recognizer = UITapGestureRecognizer(target: self, action: #selector(handleCollectionViewBackgroundTap(_:)))
            view.addGestureRecognizer(recognizer)
            collectionView.backgroundView = view
        }
    
        @IBAction private func handleCollectionViewBackgroundTap(_ sender: Any) {
            print("Collection view background tapped")
        }
    }
    
    extension ViewController: UICollectionViewDataSource {
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 100
        }
    
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            return collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        }
    }
    
    
[/code]


CC BY-SA 4.0
2019-04-26T07:42:05.397
54497
2019-04-26T07:42:05.397
16907
54452
answer