簡體   English   中英

如何在 Swift 中首次按下按鈕時添加觸覺,而不是在釋放按鈕之后?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM