💡
【SwiftUI】iOS17以降で使える触覚フィードバック
概要
これまでは触覚フィードバックを実装するのにUINotificationFeedbackGenerator
を使われていた方も多いと思いますが、iOS17以降ではsensoryFeedback
モディファイアが便利です。
func sensoryFeedback<T>(
_ feedback: SensoryFeedback,
trigger: T
) -> some View where T : Equatable
このモディファイアは指定された変数の値が変更された際に、指定された触覚フィードバック(SensoryFeedback)を返します。値の変更以外をトリガーにできないので、UINotificationFeedbackGeneratorの柔軟性には多少劣りますが、インスタンス生成の必要もなく、多くの場合このモディファイアで事足りると思います。
サンプルコード
sensoryFeedback
struct ContentView: View {
@State private var decrease = false
@State private var increase = false
@State private var selection = false
@State private var success = false
@State private var warning = false
@State private var error = false
@State private var impact = false
var body: some View {
VStack(spacing: 50) {
Button("decrease") {
decrease.toggle()
}
.sensoryFeedback(.decrease, trigger: decrease)
Button("increase") {
increase.toggle()
}
.sensoryFeedback(.increase, trigger: increase)
Button("selection") {
selection.toggle()
}
.sensoryFeedback(.selection, trigger: selection)
Button("success") {
success.toggle()
}
.sensoryFeedback(.success, trigger: success)
Button("warning") {
warning.toggle()
}
.sensoryFeedback(.warning, trigger: warning)
Button("error") {
error.toggle()
}
.sensoryFeedback(.error, trigger: error)
Button("impact") {
impact.toggle()
}
.sensoryFeedback(.impact, trigger: impact)
}
}
}
UINotificationFeedbackGenerator(一応)
struct ContentView: View {
private let fbGenerator = UINotificationFeedbackGenerator()
var body: some View {
Button("success") {
fbGenerator.notificationOccurred(.success)
}
Button("warning") {
fbGenerator.notificationOccurred(.warning)
}
.padding(.top)
Button("error") {
fbGenerator.notificationOccurred(.error)
}
.padding(.top)
}
}
蛇足
SensoryFeedbackのスタティックプロパディのstart
, stop
はwatchOSのみ、levelChange
, alignment
はmacOSのみ使用可能です。対象OS以外で使用した場合は、触覚フィードバックは機能しません。
Discussion