下面是一个简单的正方形的代码,我将一个MagnificationGesture附加到这个方块上,用捏来缩放的手势来更新它的状态。
import SwiftUI
struct ContentView2: View {
var scale: CGFloat = 1
var magnificationGesture: some Gesture {
MagnificationGesture()
.onChanged { value in
scale = value
}
}
var body: some View {
VStack {
Text("\(scale)")
Spacer()
Rectangle()
.fill(Color.red)
.scaleEffect(self.scale)
.gesture(
magnificationGesture
)
Spacer()
}
}
}
struct ContentView2_Previews: PreviewProvider {
static var previews: some View {
ContentView2()
}
}然而,这个简单的视图的行为却很奇怪。当我执行手势时,scale @State属性将被成功地修改。然而,当我用手做另一个手势时,scale属性将被重置为它的初始状态,而不是从其当前值开始。
这是一段关于发生的事情的视频。例如,当红色视图非常小,执行手势时,我希望它保持较小,而不是完全重置。
如何才能获得所需的行为??也就是说,scale属性没有重置。

发布于 2022-09-25 19:51:26
我能够通过在代码中添加一些来使它工作。请检查它,并让我知道它是否适用于您的用例:
import SwiftUI
struct ContentView2: View {
var magGesture = MagnificationGesture()
@State var magScale: CGFloat = 1
@State var progressingScale: CGFloat = 1
var magnificationGesture: some Gesture {
magGesture
.onChanged { progressingScale = $0 }
.onEnded {
magScale *= $0
progressingScale = 1
}
}
var body: some View {
VStack {
Text("\(magScale)")
Spacer()
Rectangle()
.fill(Color.red)
.scaleEffect(self.magScale * progressingScale)
.gesture(
magnificationGesture
)
Spacer()
}
}
}
struct ContentView2_Previews: PreviewProvider {
static var previews: some View {
ContentView2()
}
}发布于 2022-09-25 19:40:51
我通过添加另一个scale来解决这个问题,最后只更新其中一个来跟踪规模。
代码
import SwiftUI
struct ContentView2: View {
@State var previousScale: CGFloat = 1
@State var newScale: CGFloat = 1
var magnificationGesture: some Gesture {
MagnificationGesture()
.onChanged { value in
newScale = previousScale * value
}
.onEnded { value in
previousScale *= value
}
}
var body: some View {
VStack {
Text("\(newScale)")
Spacer()
Rectangle()
.fill(Color.red)
.scaleEffect(newScale)
.gesture(
magnificationGesture
)
Spacer()
}
}
}
struct ContentView2_Previews: PreviewProvider {
static var previews: some View {
ContentView2()
}
}https://stackoverflow.com/questions/73847265
复制相似问题