Похоже, что в SciftView SwiftUI нет встроенной поддержки, однако все еще есть довольно простой способ сделать это.
Создайте MagnificationGesture
, как вы и хотели, но обязательно умножьте ваш текущий масштаб на значение, которое вы получите в закрытии .onChanged
жеста. Это закрытие дает вам изменение масштаба вместо текущего значения масштаба.
Когда вы уменьшите масштаб и начнете увеличивать масштаб, оно не увеличится с текущего масштаба (0,5до 0,6 в качестве произвольного примера), он увеличится с 1 до 1,1. Вот почему вы видели странное поведение.
Этот ответ будет работать, если MagnificationGesture
находится в том же виде, что и .scaleEffect
. В противном случае ответ Джеймса будет работать лучше.
struct ContentView: View {
@State var scale: CGFloat
var body: some View {
let gesture = MagnificationGesture(minimumScaleDelta: 0.1)
.onChanged { scaleDelta in
self.scale *= scaleDelta
}
return ScrollView {
// Your ScrollView content here :)
}
.gesture(gesture)
.scaleEffect(scale)
}
}
PS Вы можете обнаружить, что использование ScrollView
для этой цели неуклюже, и вы не сможете одновременно перетаскивать и изменять масштаб. Если это так, и вы не довольны этим, я бы хотел добавить несколько жестов и скорректировать смещение вашего контента вручную, а не использовать ScrollView
.