[英]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.