タブレット用プログラムの書き止め

android OS & iPadOS の記録。

【Swift P4.5.1】Dragに二つの処理を割り当てる

2024-10-15 22:35:09 | Swift iPadOS用

ダブルタップで、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) // 透明度を変化して表示、非表示を切り替える
            }
        }
    }


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 【Swift P4.5.1】自作スクロ... | トップ | 【Swift P4.5.1】Retinaディ... »

Swift iPadOS用 」カテゴリの最新記事