
アニメーションが好きじゃなく、コピペでしのいできたけど、細かいチューニングが必要になり、調べたものを記録しておきます
@GestureState とは何か?
ジェスチャーした際の遷移したデータなどをいれる状態変数で、通常の状態変数と違い、ジェスチャーが終わると初期値に戻るところが特徴。
通常の状態変数と違い、処理が終わったあとに、初期化処理がいらない。
使う形は基本的に2種類で以下のとおり
一次元の動き(例えば、スクロールバーやスライダー): CGFloat
二次元の動き(例えば、自由に移動できるオブジェクトやマップの操作): CGSize
.animationモディファイアの使い方
.animation({種類},value:{監視する変数}) という感じで使う。
監視する変数の変化に生じて動く動作に対し、アニメーションをつける。
以下、記述例
.animation(.interpolatingSpring(mass: 0.6, stiffness: 150, damping: 80, initialVelocity: 0.1),value:dragOffset)
//dragOffsetの動きに対し、interpolatingSpringでアニメーションを付与する
.gestureモディファイアの使い方
特定のviewにおけるユーザーの行動に対する処理を定義するもの。
例:
ユーザーがviewにタップした時どうするか?ドラッグした時どうするか?など
ジェスチャーの種類について
ジェスチャーとは、ユーザーが画面上で行う物理的な動作などを指してる。
そのジェスチャーに対し、どういう状況の時(ジェスチャーが終わったタイミングなど)に何をするのか?とかを設定したりする
TapGesture
シンプルなタップ操作に反応
.onEnded
タップが終わったの処理。
Buttonとかも、TapGestureで書き換えることができる。
LongPressGesture
長押しに反応
DragGesture(minimumDistance: 0)でも同じことなので、こちらを使うと長押しの時間を検知したりもできる
.onEnded
一定時間タップした後に、手を話した際に呼ばされるのがこれ
onChangedはないらしい。
DragGesture(minimumDistance:, coordinateSpace: )
ドラッグ操作に反応。
minimumDistanceは、ジェスチャーがドラッグとして認識されるまでの最小の移動距離の設定。
その距離を超えると、ドラッグジェスチャーがアクティブになる。
ちょっとの動きでもドラッグジェスチャーとしてアクティブにさせたければ、数値を小さく。
coordinateSpaceは、ジェスチャーの位置の座標をどこからの起点で解釈するのか?を入れる
.local はview起点、.globalは画面、.named(_:)は定義したカスタム座標、他の座標と共有したりする場合に使う
.onChanged
ドラッグ中の状態変化を検知
.updating
.onChangedと似ていて、変更しつつ、@GestureState で定義した変数を更新できる。
なので、ドラッグで動かした座標などをリアルタイムで変数に格納できたりする。
.updating($dragoffset){{ value, state, _ in
}
みたいな感じで、valueがCGPoint型のdragした座標の位置、stateは、$drafoffsetの変更先のbindで、
stateに変更したい値を入れると、dragoffsetが変更される
.onEnded
ドラッグ終了後を検知
MagnificationGesture
ピンチイン、ピンチアウトに反応(ズームのこと)
.onChanged
ズーム変化を検知