释放 LongPressGesture SwiftUI 时触发动作

Posted

技术标签:

【中文标题】释放 LongPressGesture SwiftUI 时触发动作【英文标题】:Trigger action when releasing LongPressGesture SwiftUI 【发布时间】:2020-08-01 10:44:38 【问题描述】:

当我在 minimumDistance 内释放 LongPressGesture 时,我试图触发“按下”消息,但是当我长按图像时,此代码会立即打印出消息。我该如何解决这个问题?

struct ContentView: View 
    @GestureState private var isDetectingPress = false
    
    var body: some View 
        Image(systemName: "trash")
            .resizable().aspectRatio(contentMode: .fit)
            .frame(width: 100, height: 100)
            .scaleEffect(isDetectingPress ? 0.5 : 1)
            .animation(.easeInOut(duration: 0.2))
            .gesture(LongPressGesture(minimumDuration: 0.01).sequenced(before:DragGesture(minimumDistance: 100).onEnded _ in
                print("Ended")
            )
                .updating($isDetectingPress)  value, state, _ in
                    switch value 
                    case .second(true, nil):
                        state = true
                        // The message below should be printed when I release the long press
                        print("pressed")
                    case .second(true, _):
                        state = false
                        break
                    default:
                        break
                    
            )
    

【问题讨论】:

不清楚你想达到什么目的?为什么需要minimumDistance: 100 DragGesture(minimumDistance: 0) 需要保持状态,直到您继续触摸,但它在释放手指(您按下的情况)后立即调用 onEnded,但现在它等待拖动到 100 并且失败,因此没有 onEnded。你能解释一下这种行为吗? 我基本上需要在 LongPressGesture 结束但在最小距离内时执行一个动作。如果我超出了限制距离,那么我就不需要再执行这个动作了。假设我有这个“垃圾”图像并按下它,但后来我意识到我不需要松开手指来执行操作......我只需将手指移出该图像并期望不要执行我期望的操作 @xmetal 为什么不使用Button 代替(里面有图片)? 确实是标准的按钮行为 【参考方案1】:

您可以尝试以下方法:

struct ContentView: View 
    var body: some View 
        Button(action: 
            print("Pressed")
        ) 
            Image(systemName: "trash")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 100, height: 100)
        
        .buttonStyle(ScalableButtonStyle())
    


struct ScalableButtonStyle: ButtonStyle 
    let scaleWhenPressed: CGFloat = 0.75

    func makeBody(configuration: Configuration) -> some View 
        configuration.label
            .scaleEffect(configuration.isPressed ? scaleWhenPressed : 1.0)
    

【讨论】:

我太笨了...我不知道这只是一个按钮行为。这正是我一直在寻找的 我只是专注于图像,却没有意识到我可以用一个按钮来做到这一点 @xmetal 别担心。我们都会犯错误 :) 我们就是这样学习的。 我最喜欢的名言 :) brainyquote.com/quotes/oscar_wilde_105029

以上是关于释放 LongPressGesture SwiftUI 时触发动作的主要内容,如果未能解决你的问题,请参考以下文章

LongPressGesture 与自定义代表被调用两次。是因为我的代表吗?

Swift:在另一个 UIView 下的 UIView 的 hitTest

如何取消 LongPressGesture 以便 PanGesture 可以识别

SwiftUI - 当手指移动一点时让 LongPressGesture 保持不变?

在 UICollectionView 中使用 LongPressGesture 检索 UICollectionViewCell 的 NSIndexPath 和部分

Swift,SpriteKit:释放游戏场景并重新分配新场景