ユーザーはiphoneを操作する手段として以下のようなものがあります。
・ タップやダブルタップ
・ ドラッグ
・ スワイプ
・ ピンチアウト、ピンチイン
ユーザーがこれらを行うことをSwiftUIではジェスチャー(gesture)といい、
swiftUIではこれらのジェスチャーが起きた時に実行される関数などが定義されています。
Webでいうイベントみたいな感じですね!
ここではそのgestureについて話したいと思います!
ジェスチャーのイベント関数
ユーザーがタップなどをすることをgestureという。
関数 | 説明 |
---|---|
onTapGesture | これはタップなので、ボタンやテキストなど、特定のものをタップした時に発生するので、基本的な書き方は、Text('Tap!').onTapGesture()のように記載する。 .onTapGesture(count: 2)としたらダブルタップ |
onLongPressGesture | これはタップなので、ボタンやテキストなど、特定のものをタップした時に発生するので、基本的な書き方は、Text('Tap!').onLongPressGesture()のように記載する |
gesture(DragGesture() | Viewをスワイプするので、View.gesture(DragGesture()という感じで記載します。ただ、Dragはした時、Dragし終わった時などいくつか処理のタイミングがある。 onChanged・・位置に変更があると実行されます、onEnded・・ドラッグ後に実行されます、updating・・?、Swipe は、Swipe途中ではなく、Swipe後に反応すれば良いので、onEnded を使って実装します。 |
MagnificationGesture | ? |
RotationGesture | ? |
上記のgestureにプラスで
updating(Gestureの値が更新されたときに発火:一時的なUIの状態を変更したいとき、@GestureStateを使用してGestureの状態を管理する)
onChange(Gestureの値が更新されたときに発火: 永続的な値を変更したいとき)
onEnded(Gesture終了時に発火)
を指定できる。
.gesture(DragGesture(minimumDistance: 5)
のminimumDistanceは最低5pxドラッグしたら処理を始めるということ。
コードの書き方
コードの書き方は以下です。
↓売上金額という文字をユーザがタップした時の処理を記載します。
Text("売上金額").onTapGesture { // 処理を記載する }
↓これは売上金額という文字をダブルタップ(2回タップ)したら実行します。
Text("売上金額").onTapGesture(count: 2){ // 処理を記載する }
↓これは売上金額という文字を長く触っていた時に実行します。
Text("売上金額").onLongPressGesture( // 処理を記載する )
↓これはスワイプした時に実行します。スワイプは長い間指を動かす動作なので、スワイプしている時の処理、スワイプ完了時(指を離した時)の処理の2つで記載可能。
通常はスワイプは文字だったり、ボタンに対してするものではないのでviewに対してgesture()でスワイプ機能を実装しています。
ZStack(alignment: .topLeading) { } .gesture(DragGesture(minimumDistance: 5) .onChanged{ value in // スワイプしている間の処理 } .onEnded { value in // スワイプが完了した時の処理 } )
valueはスワイプ情報が格納されています。
ジェスチャーオブジェクトから取得できる情報
DragGesture.Value プロパティとして以下のものがあります
var location: CGPoint
現在の場所
var predictedEndLocation: CGPoint
現在の速度からの今止まった場合の最終位置の予測
var predictedEndTranslation: CGSize
現在の速度からの今止まった場合の最終移動の予測
var startLocation: CGPoint
gestureの開始位置
var time: Date
現在のドラッグイベントに関連付けられた時間
var translation: CGSize
ドラッグの開始から現在までの総移動合計
DragGesture.Value のインスタンスを生成して、ドラッグの変化に応じてViewの座標を変えていくとドラッグが実現します。