[SwiftUI] タップや長押しの認識、onTapGestureとonLongPressGesture

Viewのタップや長押しを認識してアクションを起こす機能が Modifiers の onTapGesture, onLongPressGesture の設定で可能です。
Storyboardでは画面タッチや長押しの機能が UITapGestureRecognizer, UILongPressGestureRecognizer がありました。似たような名前ですがそのまま置き換えはできません

Swift 5.3
Xcode 12.4

Gesture

  • onTapGesture:タップ
  • onLongPressGesture:長押し

これらはViewのModifier設定なので Text や Image などViewそれぞれ個別に設定できます。

onTapGesture

コードの「Text」あるいはPreviewの「Hello World!」から

画面右のUtility AreaにあるModifierの「Add Modifier」から、

on Tap Gesture を探して追加します。

 

コードに反映されます。


タップするたびにテキストが変わるように作ってみると
ContentView.swift


Toggleを使ってタップされるとフラグが反転するようにしました。

これはTextですがButtonのような感じですね。

onTapGestureの定義としてはこれ以外にタップ回数を数えるcountがあります

countを使えば、例えばダブルタップでのに発火するようにすることも可能です。

onLongPressGesture

Tapと同じよう .onLongPressGesture を追加すると機能します。


ContentView.swift

LongPressですがTapとの違いは持続時間によるのですが、デフォルトでは0.5secですが例えばこれを2.0secに変更することができます。


onLongPressGestureの定義は以下のようになって、最小判定時間以外にもいくつかの設定が可能です。

  • minimumDuration:最小判定時間、デフォルト0.5sec
  • maximumDistance:最大判定距離、デフォルト10 (CGFloat)
    • これは判定範囲が広がるのではなく判定計測が始まってからPress位置が移動しても判定継続される範囲のこと
  • pressing:判定の開始と終了をBoolで取り出せる、デフォルトはnil
  • perform:LongPressでのアクション



References:
onTapGesture(count:perform:) — Text | Apple Developer
onLongPressGesture(minimumDuration — Apple Developer
minimumDuration — LongPressGesture | Apple Developer
maximumDistance — LongPressGesture | Apple Developer