見出し画像

SwiftUIでいこう! - Drag Gesture

参考サイトです

ドラッグできるようにします。

@GestureState private var dragOffset = CGSize.zero

@GestureState で変数を定義します。

"CGSize.zero"の使い方も記録しておきます。

CGSize(width: 数値, height: 数値)

ということで設定できます。今回は"CGSize.zero"なので

CGSize(width: 0, height: 0)

ということです。

そしてこの変数の使い所、

.gesture(
          DragGesture()
            .updating($dragOffset, body: { (value, state, transaction) in
                 state = value.translation
             })
 )

.gestureの中でDragGesture()を使い、

.updating($dragOffset, body: { (value, state, transaction) in
state = value.translation
})

でドラッグできる状態となっています。ドラッグの終了と同時に元の位置"(0,0)"に戻ります。

これをドラッグして移動させて、その場所に留めたい時は、@Stateをつけた変数"position"を定義します。

@State private var position = CGSize.zero

これで、変数にその位置を覚えさせることで実現ができます。

次に、座標を保存するように命令を

 Image(systemName: "applelogo")

の中に入れます。

.offset(x: position.width + dragOffset.width, y: position.height + dragOffset.height)

そして、ドラッグするときの命令、DragGesture()の

.updating()

の後に

.onEnded()

を付け加えます。.onEnded()の中身は、

.onEnded({ (value) in
      self.position.height += value.translation.height
      self.position.width += value.translation.width
 })

ドラッグが終わった時点での座標をセットします。

コード全体です。

 struct ContentView: View {
   @GestureState private var dragOffset = CGSize.zero
   @State private var position = CGSize.zero

   var body: some View {
       Image(systemName: "star.circle.fill")
           .font(.system(size: 100))
           .offset(x: position.width + dragOffset.width, y: position.height + dragOffset.height)
           .animation(.easeInOut)
           .foregroundColor(.green)
           .gesture(
               DragGesture()
                   .updating($dragOffset, body: { (value, state, transaction) in

                       state = value.translation
                       
                       
                   })
                   .onEnded({ (value) in
                                      self.position.height += value.translation.height
                                      self.position.width += value.translation.width
                                  })
           )
   }
}


この記事が気に入ったらサポートをしてみませんか?