【SwiftUI】バイブレーションの使い方

こんにちはコーヤです。

このページでは、SwiftUIでのバイブレーションの使い方をご紹介します。

以下のバージョンで動作確認しています。

  • Xcode 14.2
  • Swift 5.7.2

バイブレーションの種類

バイブレーションは2種類あります。1回振動(ブー)と2回振動(ブッブー)です。

その2種類を組み合わせて、何秒おきに何回振動させるなどのカスタムや、振動させ続けるなどができます。

バイブレーションのソースコード

2行目のimport文を忘れないように注意です。

import SwiftUI
import AudioToolbox

struct ContentView: View {
    
    @State var isVibration = false
    
    var body: some View {
        VStack {
            Button("Once") {
                AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) {}
            }
            Button("Twice") {
                AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(1011)) {}
            }
            //0.6秒おきに5回振動
            Button("Custom") {
                for _ in 0...4{
                    AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) {}
                    Thread.sleep(forTimeInterval: 0.6)
                }
            }
            HStack {
                Button("Infinity-On") {
                    isVibration = true
                    vibration()
                }
                Button("Infinity-Off") {
                    isVibration = false
                }
            }
        }
        .buttonStyle(.borderedProminent)
        .font(.largeTitle)
    }
    
    func vibration() {
        if !isVibration {
            return
        } else {
            //1秒おきに振動を続ける
            AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) {
                Thread.sleep(forTimeInterval: 1.0)
                vibration()
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Thread.sleep(forTimeInterval: 0.6)で0.6秒おきに振動させていますが、この間隔が短すぎるとうまく振動しないようです。私の環境だと0.6秒なら正常に振動しましたが、0.5秒だとダメでした。

IDが1011か1311だと2回振動になるみたいです。他のIDを入れたら別の振動方法になるのかもしれません。ご存じの方いらっしゃったらご教示いただけると幸いです。

以上です。ご参考になれば幸いです。

コメント欄