本記事では、SwiftUIのNavigationLinkをタップした際に、触覚フィードバック(振動)を追加してユーザー体験を向上させる方法を紹介します。
何も考えずに実装すると、NavigationLinkが正常に動作しなくなってしまうアンチケースも紹介します。
触覚フィードバック関数の準備
まず、触覚フィードバックを実行する関数を用意します。
import Foundation
import class UIKit.UIImpactFeedbackGenerator
public func playImpactHaptic(_ style: UIImpactFeedbackGenerator.FeedbackStyle) {
let generator = UIImpactFeedbackGenerator(style: style)
generator.impactOccurred()
}
NavigationLinkに触覚フィードバックを追加
.simultaneousGestureを付与することで、NavigationLinkの標準動作を妨げることなく触覚フィードバックを追加できます。
NavigationLink(destination: DetailView()) {
Text("詳細を見る")
}
.simultaneousGesture(
TapGesture()
.onEnded { _ in
playImpactHaptic(.light)
}
)
アンチケース
以下は、アンケースとなります。
NavigationLinkをタップした時にonTapGestureが判定を奪い取り、画面遷移することはないです。
NavigationLink(destination: DetailView()) {
Text("詳細を見る")
}
.onTapGesture {
playImpactHaptic(.light)
}
SimultaneousGesture (サイマルテイニアス ジェスチャー)
以下の様なイメージを持っています。
元のタップ処理:「画面遷移する」
追加のタップ処理:「振動させる」
→ 両方が同時に実行される = 「画面遷移しながら振動もする」
つまり、既存の機能を壊さずに新しい機能を追加したい時に使うのがSimultaneousGestureです。
まとめ
.simultaneousGestureを付与することで、NavigationLinkの標準機能を維持しながら、簡単に触覚フィードバックを追加できます。