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

android OS & iPadOS の記録。

【Swift P4.5.1】拡大縮小。ピンチジェスチャー

2024-10-02 20:34:46 | Swift iPadOS用

ピンチジェスチャーでのズーム倍率は必ず(1.0)から始まるらしい。
参考書通りに書くとピンチ始まりで必ず原画サイズに戻ってからの拡大になる。
倍率を保存して、そこから再開すれば指を離しても継続できる。とは分かるけど上手くいかない…。

検索に少々掛ったけど何とか見つけた。

note.comさんの
【SwiftUIでImageをピンチイン・ピンチアウト・ダブルタップでズームさせる】

コピペで検索してください。
記事ではズームとスクロールを両立していました。

ここではズームの継続のみ切り出しています。


import SwiftUI

struct ContentView: View {
    @State private var currentScale: CGFloat = 1.0
    @State private var lastMagnificationValue: CGFloat = 1.0
    var body: some View {
                
        Image(uiImage: UIImage(named: "Test")! ) 
            .resizable()
            .scaledToFill()
            .scaleEffect(currentScale)
            .gesture(
                MagnifyGesture()
                    .onChanged { value in
                        let changeRate = value.magnification / lastMagnificationValue
                        currentScale *= changeRate
                        currentScale = max(1.0, currentScale )
                        lastMagnificationValue = value.magnification
                    }
                    .onEnded { value in
                        lastMagnificationValue = 1.0
                    }
             )
    }
}

数値の計算と設定方法で自分の工夫以上に簡単な記述となった^^。

このコードだと倍率1.0以下になるとエラーになるので
currentScale = max(1.0, currentScale )
倍率1.0以上をセットしている。

frameをきちんと設定すれば良いのかもしれない。