[英]How can I add haptics on initial press of a button in Swift, not after the button has been released?
我熟悉 UIImpactFeedbackGenerator,你必须在按钮的操作中使用它而不是 with.onTapGesture。 我想不通的是如何让触觉在初始按钮按下而不是按钮释放时触发。
我最初尝试了这段代码,它只适用于按钮释放:
struct HapticButton: View {
var body: some View {
Button {
let impactLight = UIImpactFeedbackGenerator(style: .light)
impactLight.impactOccurred()
} label: {
Text("Haptic Button")
}
}
}
然后我尝试将 simultaneousGesture 修改器与 DragGesture 一起使用,它在按下按钮时立即实现了触觉效果——但是,每次按下按钮后在屏幕上拖动手指时它也会重复触觉。 这对于您想要保持的颜色变化非常有用,但对于触觉事件则不太好。 该代码如下所示:
struct HapticButton: View {
var body: some View {
Button {
let impactLight = UIImpactFeedbackGenerator(style: .light)
impactLight.impactOccurred()
} label: {
Text("Haptic Button")
}
.simultaneousGesture(
DragGesture(minimumDistance: 0)
.onChanged({ _ in
let impactLight = UIImpactFeedbackGenerator(style: .light)
impactLight.impactOccurred()
})
)
}
}
关于如何在初次按下时仅应用一次触觉效果的任何提示? 有关我正在寻找的行为示例,请查看 iOS 键盘。 触觉会在您触摸它们的键时立即发生,而不是在您释放它之后发生,并且如果您拖动则不会重复发生。
扩展您提出的解决方案,我们可以创建一个自定义视图修改器。 我们可以跟踪 DragGesture 是否启动并仅针对初始按下触发触觉效果。
struct HapticOnTouch: ViewModifier {
@State var isDragging: Bool = false
func body(content: Content) -> some View {
content
.simultaneousGesture(
DragGesture(minimumDistance: 0)
.onChanged { _ in
if !isDragging {
let impactLight = UIImpactFeedbackGenerator(style: .light)
impactLight.impactOccurred()
}
isDragging = true
}
.onEnded { _ in
isDragging = false
}
)
}
}
extension View {
func hapticOnTouch() -> some View {
modifier(HapticOnTouch())
}
}
然后您可以将此效果应用于任何视图或按钮,如下所示:
Button {
// perform action
} label: {
Text("Haptic Button")
}
.hapticOnTouch()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.