为什么 MagnificationGesture 在 SwiftUI 中只更新一次状态?

chu*_*tar 2 core-graphics gesture ios swift swiftui

我希望以下视图能够响应放大手势,但它仅在第一次有效。视图可以按预期放大,但视图释放后,后续触摸不会触发手势。

有没有办法让手势持续工作?

struct Card: View {
    @State var magScale: CGFloat = 1

    var magnification: some Gesture {
        MagnificationGesture().onChanged { gesture in magScale = gesture }
    }

    var body: some View {
        Rectangle()
            .frame(width: 200, height: 200, alignment: .center)
            .scaleEffect(self.magScale)
            .gesture(magnification)
    }
}
Run Code Online (Sandbox Code Playgroud)

该视图的使用方式如下:

struct ContentView: View {
    var body: some View {
        ZStack {
            Color.blue
            Card()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 5

这是一个解决方案。使用Xcode 12进行测试(对于以下版本,某些语法可能需要调整)

演示

struct Card: View {
    @State var magScale: CGFloat = 1
    @State var progressingScale: CGFloat = 1

    var magnification: some Gesture {
        MagnificationGesture()
            .onChanged { progressingScale = $0 }
            .onEnded {
                magScale *= $0
                progressingScale = 1
            }
    }

    var body: some View {
        Rectangle()
            .frame(width: 200, height: 200, alignment: .center)
            .scaleEffect(self.magScale * progressingScale)
            .gesture(magnification)
    }
}
Run Code Online (Sandbox Code Playgroud)