如何在 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 上的重新触发的主要内容,如果未能解决你的问题,请参考以下文章

如何使 on_touch_down 小部件具体化?

如何在iphone sdk的Touch down事件中设置增加声音的速率并重复这个声音

滑动页面时防止touch事件的误触问题

同时使用 touch down 和 touch up 手势识别器

UIButton 对 Touch Down 事件的响应

UIButton 不会立即检测到 Touch Down