我有一个简单正方形的以下代码,我将一个 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()
}
}
但是这个简单的 View 表现得很奇怪。当我执行手势时,scale
@State
属性已成功修改。但是,当我用手做另一个手势时,scale
属性将重置为其初始状态,而不是从其当前值开始。
这是一段视频,讲述了所发生的事情。例如,当红色 View 非常小时,执行手势时,我希望它保持很小,而不是完全重置。
如何获得所需的行为 - 即 scale
属性未重置
最佳答案
我可以通过在代码中添加一些内容来使其工作。检查一下并告诉我这是否适合您的用例:
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()
}
}
关于SwiftUI 手势状态在手势之间重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73847265/