Я довольно новичок в CoreMotion, но я пытаюсь создать приложение, которое использует CoreMotion, чтобы увидеть, прыгает ли пользователь вверх и вниз (подумайте, прыгая через скакалку). Также необходимо позволить пользователю иметь возможность держать телефон (без iWatch) так, как он хочет (пейзаж, портрет, странный наклон и т. Д.), И при этом иметь возможность определять, перемещаются ли они вверх и вниз независимо от этого. Я думаю, что это немного похоже на приложение «выбросить телефон», но без измерения расстояния.
Так что я использую userAcceleration и гравитацию, чтобы увидеть, какой путь «вниз», проверив значение другой оси гравитации, и это работает хорошо, но это похоже на неуклюжий способ сделать это.
Есть ли лучший способ сделать то, что я делаю? По сути, в настоящее время все, что нужно приложению, - это знать, есть ли ускорение, перпендикулярное земле (независимо от того, как вы держите телефон).
import UIKit
import CoreMotion
class TestViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
startJump()
}
func startJump() {
if CMMotionManager.shared.isDeviceMotionAvailable {
CMMotionManager.shared.deviceMotionUpdateInterval = 0.01
CMMotionManager.shared.startDeviceMotionUpdates(to: OperationQueue.current!) { (data, error) in
guard let myData = data else {
return
}
var gravX = abs(myData.gravity.x)
var gravY = abs(myData.gravity.y)
var gravZ = abs(myData.gravity.z)
var userX = abs(myData.userAcceleration.x)
var userY = abs(myData.userAcceleration.y)
var userZ = abs(myData.userAcceleration.z)
if gravZ > 0.9 && userZ > 1 {
print("Jump; Z is up")
}
if gravX > 0.9 && userX > 1 {
print("Jump; X is up ")
}
if gravY > 0.9 && userY > 1 {
print("Jump; Y is up")
}
}
}
}
override func viewDidDisappear(_ animated: Bool) {
CMMotionManager.shared.stopDeviceMotionUpdates()
}
}