无法在 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
正如 onChanged
的 documentation 所述,当 Gesture.Value
为 Equatable
时,该方法仅适用于 Gesture
。但是,TapGesture.Value
是 Void
,它不是 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 }
)
}
}
}
如果尝试 运行 下面的代码,我会收到以下错误消息:
// 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
正如 onChanged
的 documentation 所述,当 Gesture.Value
为 Equatable
时,该方法仅适用于 Gesture
。但是,TapGesture.Value
是 Void
,它不是 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 }
)
}
}
}