如何在 Touch Down 实现时防止 SwiftUI 上的重新触发
Posted
技术标签:
【中文标题】如何在 Touch Down 实现时防止 SwiftUI 上的重新触发【英文标题】:How to Prevent Retrigger on SwiftUI On Touch Down Implementation 【发布时间】:2020-09-14 00:37:11 【问题描述】:我遵循了这个媒介article,以便为我的应用实现触摸向下/触摸向上手势控制。它可以工作,但可以在同一个元素/视图上重新触发。该应用程序是一种仪器,如果检测到另一个触摸,这会导致按键偶尔卡在触发位置。所以偶尔有些音符会卡在 on 位置并停留在那里。代码如下:
.gesture(
DragGesture(minimumDistance: 0)
.onChanged _ in
if !triggered
triggered = true
model.noteOn(note: midiVal)
.onEnded _ in
model.noteOff(note: midiVal)
triggered = false
)
我怎样才能调整这个实现,以便不会重新触发已经按下的音符?
【问题讨论】:
【参考方案1】:所以我找到了解决方案。你想做的是在DragGesture
上使用@GestureState
和.updating()
// 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
【讨论】:
以上是关于如何在 Touch Down 实现时防止 SwiftUI 上的重新触发的主要内容,如果未能解决你的问题,请参考以下文章
如何在iphone sdk的Touch down事件中设置增加声音的速率并重复这个声音