ダブルタップで、isModeを true <-> false と切り替える。(ボタンで切り替えるのも良いかな)
true の時にアイコンを表示して画像をドラッグでスクロール。
falseの時にアイコンを非表示にしてドラッグ座標値を処理する。(切り抜きとか)
struct SubView: View {
// 省略
@State private var handLocation = CGPoint.zero
func drag_scroll(size: CGSize) {
// 変更無しなので省略
}
var dragGesture: some Gesture {
DragGesture()
.onChanged { value in
if isMode {
drag_scroll(size: value.translation)
handLocation = value.location // 指し手アイコンを表示する場所
}
else {
var point = value.location
point = convertImagePosition(viewPoint: point, imageOffset: lastOffset)
print("x: \(point.x) y: \(point.y)" ) // 画像上の座標
}
}
.onEnded {_ in
if isMode {
lastOffset = offset
}
else {
// 最終処理
}
}
}
func convertImagePosition( viewPoint:CGPoint, imageOffset: CGSize ) -> CGPoint {
var point = viewPoint
point.x = ( point.x - imageOffset.width ) / currentScale
point.y = ( point.y - imageOffset.height ) / currentScale
return point
}
var body: some View {
ZStack(alignment: .leading) {
GeometryReader { geometry in
Image(uiImage: image!)
.resizable()
.frame( width: image!.size.width * currentScale, height: image!.size.height * currentScale )
.background(GeometryReader {value in
Color.clear
.onAppear{
viewSize = geometry.size
}
})
.offset(offset)
.gesture(dragGesture)
.gesture(TapGesture(count: 2) // ダブルタップでドラッグでの処理を切り替える
.onEnded() {_ in
isMode = !isMode
}
)
Image(systemName: "hand.point.up") // 指し手アイコン、スクロールモードの時に表示する
.font(.largeTitle)
.foregroundColor(.white)
.position(handLocation)
.opacity(isMode ? 1: 0) // 透明度を変化して表示、非表示を切り替える
}
}
}
}