質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

1回答

1552閲覧

DragGestureの引数『coordinateSpace』の役割がわからないです 【SwiftUI】

tefusaki

総合スコア1

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2020/11/09 09:48

前提・実現したいこと

SwiftUI で DragGesture を使用する際に利用可能な『coordinateSpace』の引数について理解したいです。

公式ドキュメントを見ても 「coordinateSpace: .local」 と 「coordinateSpace: .global」 についての記述は一切なく、
コードを色々試して実験してみても、
①、「coordinateSpace: .local」 は gesture.location.y や gesture.translation.height の値が大幅にブレるように変動して一定に変化しない謎が解決できず、
②、 「coordinateSpace: .global」 は一定に変化するもののドラッグ検知(初期)時の初期値が理解できず、

どうしたらいいのかわからない状況です。

※実現したいこと
・「coordinateSpace: .local」 と 「coordinateSpace: .global」 の違い、役割について知りたいです。
・それについて書かれてあるドキュメントやサイトがあれば教えていただきたいです。
・今回自分が理解できない点、①②に関連することで少しでも知識のある方がいらっしゃれば教えてほしいです。

該当のソースコード

import SwiftUI struct bgChart: View { // MARK: - Property var imageName: String var chartHeight: CGFloat = 300 @State var percent: CGFloat // MARK: - Body var body: some View { // MARK: - Chart VStack (spacing: 30) { ZStack (alignment: .bottom) { Capsule() .fill(Color("Color1")) .frame(width: 70, height: chartHeight) .shadow(color: Color("darkShadow"), radius: 4, x: 4, y: 4) .shadow(color: Color("lightShadow"), radius: 4, x: -4, y: -4) Capsule() .fill( LinearGradient(gradient: Gradient(colors: [Color("Color2"), Color("Color3")]), startPoint: .top, endPoint: .bottom) ) .frame(width: 70, height: percent * 3) // DragGesture .gesture( DragGesture(minimumDistance: 0, coordinateSpace: .global) .onChanged({ (value) in percent = (1 - (value.translation.height / chartHeight)) * 100 if percent > 100 { percent = 100 } if percent < 20 { percent = 20 } }) ) //: gesture } //: ZStack Image(systemName: imageName) .font(.system(size: 40)) .frame(width: 50, height: 50) .foregroundColor(Color("IconColor")) .shadow(color: Color("darkShadow"), radius: 4, x: 4, y: 4) .shadow(color: Color("lightShadow"), radius: 4, x: -4, y: -4) } //: VStack } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

あまり詳しくないですが,いくつか自分なりに試してみてわかったことを述べます.

coordinateSpace: .local は,gestureモディファイアが付与されているViewの座標系
coordinateSpace: .global は,画面全体(UIWindow)の座標系

を基にドラッグ中の座標を取得するための引数なのだと思います.

tefusakiさんのソースコードでは,2つ目の Capsule() に .gesture() が付与されており,そのDragGestureの引数は coordinateSpace: .global となっています.この場合,画面上の座標系を基準としてドラッグ中の座標を取得します.画面上の座標系というのは,画面の左上の点を原点とした座標系のことです.iPhoneX以降のiPhoneは直接原点を見ることはできませんが,下の画像あたりに原点があります.

イメージ説明

これがもし coordinateSpace: .local だった場合,gestureモディファイアが付与されている2つ目の Capsule() の座標系を基準とすることになります.カプセルがある大きさの長方形の枠にぴったり収まるとしたときの,枠の左上の点(以降点Aとする)を原点とした座標系です.
この時,Capsule() をどれだけ移動させようと,ドラッグ中の座標は常に Capsule() からみた点Aを基準としたものになるため,取得している座標がおかしいように思えるのかもしれません.

Capsule() の座標系

どのViewがどれくらいの大きさなのかを知りたい場合はXCodeの View Hierarchy を開いて確認することをお勧めします.
イメージ説明
↑こんな感じのボタンを押すと開けます.(XCode ver.14.2で確認済み)

投稿2023/03/28 16:33

masa1101

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問