【Swift】タップスルーなViewを作成する
このView
のタップイベントをスルーして、背面にあるView
をタップできるようにしたいという場面は、たまに遭遇するかと思います。今回はそんな場面で使えるSwift
の小ネタについて書こうかと思います👷♀️
結論
hitTest(_:with:)
で受け取ったイベントが自分自身である場合は、タップイベントをスルーするUIView
のサブクラスを下記のように作りました。
class TapThroughView: UIView { override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { let view = super.hitTest(point, with: event) if view == self { return nil } return view } }
ちなみにhitTest(_:with:)
は、タップされたView
階層の最も深い位置(ルートとなるView
)からサブビューへ、再帰的に呼び出されることでイベントを受信する最前のView
を見つけます。また、isHidden
がtrue
だったり、isUserInteractionEnabled
がfalse
だったり、alpha
が0.01
未満の場合は、このメソッドは呼び出されません。
てな感じで本日も以上になります🍺
参考
- https://qiita.com/takehilo/items/ff90c23ec83809539c3c
- https://developer.apple.com/documentation/uikit/uiview/1622469-hittest