💡

【SwiftUI】iOS17以降で使える触覚フィードバック

2024/01/06に公開

概要

これまでは触覚フィードバックを実装するのにUINotificationFeedbackGeneratorを使われていた方も多いと思いますが、iOS17以降ではsensoryFeedbackモディファイアが便利です。

func sensoryFeedback<T>(
    _ feedback: SensoryFeedback,
    trigger: T
) -> some View where T : Equatable

https://developer.apple.com/documentation/swiftui/view/sensoryfeedback(_:trigger:)

このモディファイアは指定された変数の値が変更された際に、指定された触覚フィードバック(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