将 VStack 的位置保存在 @State 私有变量中

Posted

技术标签:

【中文标题】将 VStack 的位置保存在 @State 私有变量中【英文标题】:save the position of a VStack in a @State private var 【发布时间】:2020-09-07 05:56:02 【问题描述】:

是否可以获取保存在@State 私有变量中的 VStack 视图的位置,以便能够在拖动手势移动后将 VStack 重置到该位置? 我没有任何代码,我用几何阅读器尝试的一切都失败了。 谢谢

【问题讨论】:

【参考方案1】:

嗯,最后在第 17 章被 AppCoda 的 Simon NG 解决了 理解他的优秀教程 Mastering-SwiftUI 的手势。 非常感谢您,Simon!

要使视图停留在拖动结束时使用:

struct ContentView: View 
// drag gesture,remain at end position
@GestureState private var dragOffset = CGSize.zero
@State private var position = CGSize.zero

var body: some View 
    Image(systemName: "star.circle.fill")
        .font(.system(size: 100))
        .offset(x: position.width + dragOffset.width, y: position.height + dragOffset.height)
        .animation(.easeInOut)
        .foregroundColor(.green)
        .gesture(
            DragGesture()
                .updating($dragOffset, body:  (value, state, transaction) in
                    state = value.translation
                )
                .onEnded( (value) in
                    self.position.height += value.translation.height
                    self.position.width += value.translation.width
                )
        )

让它回到原来的位置使用:

struct ContentView4: View 
// drag gesture,return to start position
@GestureState private var dragOffset = CGSize.zero

var body: some View 
    Image(systemName: "star.circle.fill")
        .font(.system(size: 100))
        .offset(x: dragOffset.width, y: dragOffset.height)
        .animation(.easeInOut)
        .foregroundColor(.green)
        .gesture(
            DragGesture()
                .updating($dragOffset, body:  (value, state, transaction) in

                    state = value.translation
                )
        )

【讨论】:

以上是关于将 VStack 的位置保存在 @State 私有变量中的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS Widgets 中,是不是必须将只读数据标记为 @State?

修复与主视图相关的 VStack,即使页面滚动,它也保持在同一个位置

带有灵活 Spacer 的 SwiftUI VStack

使用手势后删除视图和移动内容

如何在 SwiftUI 中禁用位置动画?

jsf 覆盖默认 javax.faces.STATE_SAVING_METHOD 以获得具体视图