【Swift】UiViewのタップ領域を拡張する方法!UIEdgeInsetsの使い方

この記事からわかること
- Swift/UIKitでUIViewのタップ領域を拡大する方法
- UIEdgeInsetsとは?
- CGRectContainsPointとは?
- point(inside point: CGPoint, with event: UIEvent?) -> Boolとは?
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
この記事は以下の記事を参考にさせていただき、最新のコードに書き換えて自分の理解のために解説を増やした記事になります。
参考記事: Qiita:【iOS】UIButtonのタップ領域だけを拡大する
UIViewのタップ領域を拡張する方法
UIViewにタップなどのジェスチャーイベントを付与している場合にViewの大きさはそこまで大きくしたくないがタップ判定領域だけ拡大したい場合がありました。UXを考えた時にタップしやすい設計にするためにタップ判定領域を自由にコントロールできると便利になります。
UIViewのタップ領域を拡張するためには以下のようにタップ領域を拡張できる汎用的なビュークラスを実装します。
その拡張ビュークラスをインスタンス化し拡大したい領域をUIEdgeInsets
で指定します。以下の場合は元のViewの大きさよりタップ領域のみを上下左右に20pxずつ拡大しています。

実装方法の解説
ExtensionTapAreaView
クラスで実装しているのがタップ領域の拡大です。オーバーライドしているpoint(inside point: CGPoint, with event: UIEvent?) -> Bool
は指定されたポイントがビューの境界内にあるかどうかを判定するメソッドです。
引数point
にはタップされた座標が渡され、その座標が自身のViewの領域内にあればtrue
をなければfalse
を返します。ここでtrue
を返すことができればViewに付与しているタップジェスチャーを発火させることができます。
Viewのタップ領域を拡張するためにUIEdgeInsets
型で拡張させたい上下左右の余白を定義しています。UIEdgeInsets
型はViewの領域を拡大/縮小する値を保持するデータクラスです。汎用性を高めるために定義時は全方向0を指定し、インスタンス化後に自身で値を変更することでタップ領域をカスタマイズすることができるようになっています。
point(inside point: CGPoint, with event: UIEvent?) -> Bool
の中では指定されたUIEdgeInsets
の値をタップ判定領域に追加していきます。bounds
プロパティから現在のViewの領域を取得し各座標をインセットを含めた値に変更していきます。
最後にCGRectContainsPoint
クラスで引数に渡した領域内に引数に渡された座標が含まれているかを判定します。
これでタップ領域を拡大することができているようです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。