无法在 SwiftUI 中为 TapGesture 应用“.onChanged”方法

Can't apply ".onChanged" method for TapGesture in SwiftUI

如果尝试 运行 下面的代码,我会收到以下错误消息:

// Type 'TapGesture.Value' (aka '()') cannot conform to 'Equatable'

这是一个代码:

struct PressButton: View {
    
    @Binding var pressed: Bool
                
    var body: some View {

        ZStack {            
            Circle()
                .gesture(
                    TapGesture()
                        .onChanged { _ in pressed = true }    // ERROR
                        .onEnded { _ in pressed = false }
                )
        }
    }
}

但是,.onEnded { _ in } 方法运行良好。

没有

.onChanged { _ in pressed = true }  

带有TapGesture 的修饰符请查看其他有

的修饰符

https://www.hackingwithswift.com/books/ios-swiftui/how-to-use-gestures-in-swiftui

正如 onChangeddocumentation 所述,当 Gesture.ValueEquatable 时,该方法仅适用于 Gesture。但是,TapGesture.ValueVoid,它不是 Equatable,因此 TapGesture 没有 onChanged 方法。

但是,onEnded 适用于所有 Gesture 符合类型。

A TapGesture 没有任何状态,它仅在 点击发生后 被调用。

您正在寻找的是 LongPressGesture,它会将状态公开为 Bool

我找到了一个可行的解决方案 DragGesture(minimumDistance: 0.0):

struct DrawButton: View {
    
    @Binding var pressed: Bool
                
    var body: some View {

        ZStack {              
            Circle()
                .foregroundColor(pressed ? .red : .black)

                .gesture(DragGesture(minimumDistance: 0.0)
                    .onChanged { _ in pressed = true }
                    .onEnded { _ in pressed = false }
                )
        }
    }
}