ios - 如何在 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
}
)
如何调整此实现,以便不会重新触发已按下的音符?
解决方案
所以我找到了解决方案。您要做的是使用@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
}
}
推荐阅读
- javascript - 如何通过内部html提取dom中的相邻元素
- java - Android/Java:UncaughtExceptionHandler 和 Bugsnag 并行?
- r - 保持一个因子的水平包含另一个因子中的最小水平数
- python - python-Firestore get() 性能问题
- angular - 使用“新 FormControl”处理复选框
- laravel - 如何将自定义表和自定义模型连接到 laravel 的 auth::attempt
- javascript - 使用 Math.floor 方法时出现参考错误(在 chrome 调试器中)
- python - 使用 Python 以编程方式从 .accdb 文件中导出所有表
- ios - Draw multiple lines in Swift 4
- python - 在一个数据帧中查找符号并将其替换为来自数千列的另一个数据帧的值