【问题标题】:How to Prevent Retrigger on SwiftUI On Touch Down Implementation如何在 Touch Down 实现时防止 SwiftUI 上的重新触发
【发布时间】: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
             }
)

我怎样才能调整这个实现,以便不会重新触发已经按下的音符?

【问题讨论】:

    标签: ios swift swiftui midi midi-instrument


    【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2015-08-08
      • 2013-03-09
      相关资源
      最近更新 更多