如何制作一个 SwiftUI 手势,在按下视图时继续运行代码

Lou*_*nco 4 ios swift swiftui

我正在尝试制作一个控制计数器的按钮。如果你点击它,计数器就会加一。但是,如果您点击并按住它,我希望在您按住它时计数器每 n 秒增加 1,并继续这样做,直到您松开为止。

如果我使用如下代码:

@GestureState var isDetectingLongPress = false
var plusLongPress: some Gesture {
    LongPressGesture(minimumDuration: 1)
        .updating($isDetectingLongPress) { currentstate, gestureState, _ in
            gestureState = currentstate
        }
        .onEnded { finished in
            print("LP: finished \(finished)")
        }
}
Run Code Online (Sandbox Code Playgroud)

isDetectingLongPress一秒后变为 true,然后立即变为 false 。onEnded1 秒后也会调用print in 。

我想要某种方法来继续调用代码以在手指按下视图时不断更新计数器 - 而不仅仅是在检测到长按后一次。

Asp*_*eri 5

使用以下组合来跟踪连续按下

使用 Xcode 11.4 / iOS 13.4 进行测试

@GestureState var isLongPress = false // will be true till tap hold

var plusLongPress: some Gesture {
    LongPressGesture(minimumDuration: 1).sequenced(before:   
          DragGesture(minimumDistance: 0, coordinateSpace: 
          .local)).updating($isLongPress) { value, state, transaction in
            switch value {
                case .second(true, nil):
                    state = true
                   // side effect here if needed
                default:
                    break
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么需要通过拖动手势对其进行排序? (2认同)

wzb*_*zon 5

DragGestureonChangedonEnded.

只需将其添加到您的View.

@State private var isPaused = false

.gesture(
    DragGesture(minimumDistance: 0)
        .onChanged({ _ in
            isPaused = true
        })
        .onEnded({ _ in
            isPaused = false
        })
)
Run Code Online (Sandbox Code Playgroud)

您可以将其作为 a 添加simultaneousGesture到 a Button

你可以从这篇文章中使用一个ViewModifier来美化它。