如何防止在TouchUI实现上的SwiftUI触发

问题描述

我遵循了这种媒介article,以便为我的应用实现触摸上下触摸手势控制。它可以工作,但是可以在同一元素/视图上重新触发。该应用程序是一种乐器,如果检测到其他触摸,这有时会导致按键卡在触发位置。因此,有些音符有时会卡在打开位置并停留在该位置。代码如下:

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

我如何调整此实现,以免再次按下已经按下的音符?

解决方法

因此,我找到了解决方案。您要做的是在@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会在触摸释放时自动返回其原始状态。从那里只需创建一个回调View扩展,即可查看触摸状态。我的实现如下所示:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...