ピンチジェスチャーでのズーム倍率は必ず(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をきちんと設定すれば良いのかもしれない。