首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI手势状态在手势之间重置

SwiftUI手势状态在手势之间重置
EN

Stack Overflow用户
提问于 2022-09-25 19:21:14
回答 2查看 67关注 0票数 1

下面是一个简单的正方形的代码,我将一个MagnificationGesture附加到这个方块上,用捏来缩放的手势来更新它的状态。

代码语言:javascript
复制
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()
    }
}

然而,这个简单的视图的行为却很奇怪。当我执行手势时,scale @State属性将被成功地修改。然而,当我用手做另一个手势时,scale属性将被重置为它的初始状态,而不是从其当前值开始。

这是一段关于发生的事情的视频。例如,当红色视图非常小,执行手势时,我希望它保持较小,而不是完全重置。

如何才能获得所需的行为??也就是说,scale属性没有重置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-25 19:51:26

我能够通过在代码中添加一些来使它工作。请检查它,并让我知道它是否适用于您的用例:

代码语言:javascript
复制
  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()
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-09-25 19:40:51

我通过添加另一个scale来解决这个问题,最后只更新其中一个来跟踪规模。

代码

代码语言:javascript
复制
import SwiftUI

struct ContentView2: View {
    
    @State var previousScale: CGFloat = 1
    @State var newScale: CGFloat = 1
    
    var magnificationGesture: some Gesture {
        MagnificationGesture()
            .onChanged { value in
                newScale = previousScale * value
            }
            .onEnded { value in
                previousScale *= value
            }
    }
    
    var body: some View {
        VStack {
            Text("\(newScale)")
            Spacer()
            Rectangle()
                .fill(Color.red)
                .scaleEffect(newScale)
                .gesture(
                    magnificationGesture
                )
            Spacer()
        }
    }
}

struct ContentView2_Previews: PreviewProvider {
    static var previews: some View {
        ContentView2()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73847265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档