ios - 如何为“Get-Only”变量赋值?

标签 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)
       }
}

magnifyBy =值

抛出一个错误:
无法分配给属性:“magnifyBy”是仅获取属性

我该怎么做才能解决此问题?

最佳答案

手势处于 Activity 状态时,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)
    }
}

请在Apple官方文章Adding Interactivity with Gestures中查看有关GestureState的详细信息。当文档充实且良好时,这种罕见的情况。

关于ios - 如何为“Get-Only”变量赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60243472/

相关文章:

ios - NSLayoutConstraints 在 Section Collapsed 时中断

ios - 将本地通知角标(Badge)计数增加到 1

ios - 如何在整个世界地图 iOS Swift 上向 MKMapView 添加叠加层

swift - 在 SwiftUI 中移动表行

swift - 如何使用 AVPlayer (macOS) 循环播放视频?

ios - 在 UIWebView 中检测双击

ios - 以 "key":"value"格式保存jsondata到plist

ios - 无法使用 NSTimer 更新 UI

ios - archiverootobject 和 unarchiverootobject 的有效文件路径

ios - Swift 2.0 ContactsUI 框架