スウィフト5
スーパービューのボタンをタップジェスチャーで
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if let _ = touch.view as? UIButton { return false }
return true
}
私の場合、hitTestの実装がうまくいきました。ボタン付きのコレクションビューがありました
このメソッドは、point(inside:with:)
各サブビューのメソッドを呼び出してビュー階層をたどり、タッチイベントを受け取るサブビューを決定します。場合はpoint(inside:with:)
trueを返し指定された点を含む最前面のビューが発見されるまで、そのサブビューの階層は、同様に横断されます。
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
guard isUserInteractionEnabled else { return nil }
guard !isHidden else { return nil }
guard alpha >= 0.01 else { return nil }
guard self.point(inside: point, with: event) else { return nil }
for eachImageCell in collectionView.visibleCells {
for eachImageButton in eachImageCell.subviews {
if let crossButton = eachImageButton as? UIButton {
if crossButton.point(inside: convert(point, to: crossButton), with: event) {
return crossButton
}
}
}
}
return super.hitTest(point, with: event)
}