はじめに
こんにちは、HappyManaです。
AppleWatchでSwiftでモーションデータを取得する方法はあったのですが、SwiftUIに書き直したかったので、SwiftUIでAppleWatchのモーションデータを取得して表示する処理を書きました。
コード
import SwiftUI
import WatchKit
import CoreMotion
struct GetMotionData: View {
private var motion = CMMotionManager()
@State var roll: Double = 0
@State var pitch: Double = 0
@State var yaw: Double = 0
@State var rotationRateX: Double = 0
@State var rotationRateY: Double = 0
@State var rotationRateZ: Double = 0
@State var gravityX: Double = 0
@State var gravityY: Double = 0
@State var gravityZ: Double = 0
@State var accelerationX: Double = 0
@State var accelerationY: Double = 0
@State var accelerationZ: Double = 0
// 取得を開始
func startUpdates() {
if motion.isDeviceMotionAvailable {
motion.deviceMotionUpdateInterval = 1 / 60
motion.startDeviceMotionUpdates(to: OperationQueue.current!) { [self] (motionData, error) in
guard let data = motionData else {
print("Device Motion Error: \(String(describing: error))")
return
}
roll = data.attitude.roll
pitch = data.attitude.pitch
yaw = data.attitude.yaw
rotationRateX = data.rotationRate.x
rotationRateY = data.rotationRate.y
rotationRateZ = data.rotationRate.z
gravityX = data.gravity.x
gravityY = data.gravity.y
gravityZ = data.gravity.z
accelerationX = data.userAcceleration.x
accelerationY = data.userAcceleration.y
accelerationZ = data.userAcceleration.z
let motionDataString = "\(roll),\(pitch),\(yaw),\(rotationRateX),\(rotationRateY),\(rotationRateZ),\(gravityX),\(gravityY),\(gravityZ),\(accelerationX),\(accelerationY),\(accelerationZ)"
print(motionDataString)
}
}
}
// 取得を終了
func stopUpdates() {
if motion.isDeviceMotionAvailable {
motion.stopDeviceMotionUpdates()
}
}
// view
var body: some View {
VStack(spacing: 1) {
Text("roll: \(roll)")
Text("pitch: \(pitch)")
Text("yaw: \(yaw)")
Text("rotationRateX: \(rotationRateX)")
Text("rotationRateY: \(rotationRateY)")
Text("rotationRateZ: \(rotationRateZ)")
Text("gravityX: \(gravityX)")
Text("gravityY: \(gravityY)")
Text("gravityZ: \(gravityZ)")
Text("accelerationX: \(accelerationX)")
Text("accelerationY: \(accelerationY)")
Text("accelerationZ: \(accelerationZ)")
}
// 画面が表示されたら取得を開始する
.onAppear {
startUpdates()
}
// 画面が非表示になったら取得を終了する
.onDisappear {
stopUpdates()
}
}
}