如何为“仅获取”变量赋值?

A4_*_*_TS 1 ios swift swiftui

我是 Swift 和 SwiftUI 的新手。目前,当用户进行缩放时,图像会在完成后返回到常规位置。我希望拥有它,以便当用户停止放大图片时,它会保持放大状态。

struct ContentView: View {
   @GestureState var magnifyBy = CGFloat(1.0)
   @State var zoomIn = CGFloat(1.0)

    var magnification: some Gesture {
           MagnificationGesture()
               .updating($magnifyBy) { currentState, gestureState, transaction in
                gestureState = currentState
           }.onEnded{value in
               magnifyBy = value
        }
    }

    var body: some View {
           Circle()
               .frame(width: 100 * magnifyBy,
                      height: 100 * magnifyBy,
                      alignment: .center)
       }
}
Run Code Online (Sandbox Code Playgroud)

放大倍数 = 值

引发错误: 无法分配给属性:“magnifyBy”是仅获取属性

我可以做什么来解决这个问题?

Asp*_*eri 6

GestureState当手势处于活动状态时处于活动状态,并且必须仅在该时间范围内使用,并相应更新。手势完成后,相应的手势状态将重置为初始值。因此,为了使更改持久,我们需要单独存储它。

这是可能的方法(经过测试并适用于 Xcode 11.2 / iOS 13.2)

struct ContentView: View {
    @GestureState var magnifyBy = CGFloat(1.0)
    @State var zoomIn = CGFloat(1.0)
    
    var magnification: some Gesture {
        MagnificationGesture()
            .updating($magnifyBy) { value, gestureState, transaction in
                gestureState = value // gestureState is magnifyBy
        }.onEnded{ value in
            self.zoomIn *= value // < preserve last changes
        }
    }
    
    var body: some View {
        Circle()
            .frame(width: 100 * magnifyBy * zoomIn, //after onEnded magnifyBy=1 again
                   height: 100 * magnifyBy * zoomIn,  
                   alignment: .center)
            .gesture(magnification)
    }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息GestureState,请参阅 Apple 官方文章“通过手势添加交互性”。文档完整且良好的情况很少见。