问题描述
我遵循了这种媒介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
}
}