首页 > 解决方案 > 如何在 Touch Down 实现时防止 SwiftUI 上的重新触发

问题描述

我关注了这篇中型文章,以便为我的应用程序实现 on touch down/on touch up 手势控制。它可以工作,但可以在同一个元素/视图上重新触发。该应用程序是一种仪器,如果检测到另一个触摸,这会导致按键偶尔卡在触发位置。所以偶尔有些音符会卡在 on 位置并停留在那里。代码如下:

 .gesture(
         DragGesture(minimumDistance: 0)
             .onChanged { _ in
                 if !triggered{
                      triggered = true
                      model.noteOn(note: midiVal)            
                 }
             }
             .onEnded { _ in
                 model.noteOff(note: midiVal)
                 triggered = false
             }
)

如何调整此实现,以便不会重新触发已按下的音符?

标签: iosswiftswiftuimidimidi-instrument

解决方案


所以我找到了解决方案。您要做的是使用@GestureState.updating()打开DragGesture

// within your View Struct

@GestureState private var triggered = false

SomeView()
  .simultaneousGesture(
                    DragGesture(minimumDistance: 0)
                        .updating($triggered, body: { (value, state, transaction) in
                            state = true
                        })
                )
                .triggerNote {
                    triggered ? model.noteOn(note: midiVal) : model.noteOff(note: midiVal)
                }

@GestureState松开触摸后会自动恢复到原始状态。从那里创建一个回调视图扩展,让您检查触摸状态。我的实现如下所示:

extension View {
    func triggerNote(playNote: (() -> Void)) -> some View {
        playNote()
        return self
    }
}

推荐阅读