DragGesture 正在取消 SwiftUI 中的 LongPressGesture

Posted

技术标签:

【中文标题】DragGesture 正在取消 SwiftUI 中的 LongPressGesture【英文标题】:DragGesture is cancelling LongPressGesture in SwiftUI 【发布时间】:2020-03-11 03:12:57 【问题描述】:

我正在寻找的行为是长按一个小图像,它会被放大,但当释放它应该再次变小。

我能够成功完成此行为;但是,我遇到的问题是在我按住后将手指从图像上滑开,以便我可以放大查看它,但这被检测为拖动手势并且它取消了我的行为。

这是我的代码

import SwiftUI


struct ContentView: View 
    @GestureState private var isPressingDown: Bool = false

    @State private var width: CGFloat = 64
    @State private var height: CGFloat = 64

    var body: some View 
        let longPress = LongPressGesture(minimumDuration: 0.2)
        let infiniteLongPress = LongPressGesture(minimumDuration: .infinity)
        let seq = longPress.sequenced(before: infiniteLongPress)
        let upd = seq.updating($isPressingDown)  value, state, transaction in
            switch value 
                case .second(true, nil):
                    state = true
                default:
                    break
            
        

        return ZStack

            Color.black
                .opacity(self.isPressingDown ? 0.5 : 0)
                .edgesIgnoringSafeArea(.all)
                .animation(.spring())


                Image("icon")
                    .resizable()
                    .frame(width:self.isPressingDown ? self.width * 5 : self.width, height:self.isPressingDown ? self.height * 5 : self.height, alignment:.center)
                    .gesture(upd)
                    .cornerRadius(10)
                    .animation(.spring(dampingFraction: 0.65))


        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    


【问题讨论】:

提供的快照不可编译。你会提供最少的可测试演示代码吗? 我编辑了我的问题并包含了完整的代码以便能够运行演示 【参考方案1】:

使用拖动手势作为第二个手势。经过测试并与 Xcode 11.2 一起使用

...
let longPress = LongPressGesture(minimumDuration: 0.2)
let infiniteLongPress = DragGesture(minimumDistance: 0, coordinateSpace: .local) // here !
...

【讨论】:

【参考方案2】:

有时 Asperi 的解决方案对我不起作用,所以我用 highPriorityGesture 围绕“接收交互数据的第一个手势”,如下所示:

...

.highPriorityGesture(
    LongPressGesture(minimumDuration: 0.5)
        .onEnded  _ in
            // do my stuff on 0.5 sec press         
        
)

.gesture(
    DragGesture()
        .onEnded 
            // do my stuff on drag
     
)

...

来自苹果的文档highPriorityGesture(_:including:):

以比手势更高的优先级将手势附加到视图 由视图定义。

【讨论】:

以上是关于DragGesture 正在取消 SwiftUI 中的 LongPressGesture的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中 DragGesture 和 ScrollView 的交互

DragGesture 块在 SwiftUI 中触摸滑块

在触发不同的 DragGesture 之前,SwiftUI DragGestures 不会更新

如何在 SwiftUI 中实现触发 switch case 的左或右 DragGesture()?

SwiftUI 中的选择器选择和翻译冲突

SwiftUI 中“触摸输入”的手势