web-dev-qa-db-ja.com

iOSでSwiftを使用して加速度計データを正しく取得するにはどうすればよいですか?

IPhoneの加速度計(自分のiPhone 5s)からデータを記録し、String(format: "%.2f", data)を使用して画面上のラベルをそのデータに設定しようとしています。ここで、dataは記録する特定の軸の値です。これを行うために、CMMotionManagerを設定し、加速度計データの記録を開始しました。また、ラベルのテキストを常に更新するタイマーがあります。ただし、Xcodeから次のエラーが発生します:「致命的なエラー:オプション値のラップ解除中に予期せずnilが見つかりました」。関連するコードは次のとおりです。

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //if accelerometer can be used, start it
    if (motionManager.accelerometerAvailable) {

        motionManager.accelerometerUpdateInterval = 0.1

        motionManager.startAccelerometerUpdates()
        let timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
    }



}

func update () {
    if (motionManager.accelerometerActive) {

        accelX.text = String(format: "%.2f", motionManager.accelerometerData.acceleration.x)
    }

}

AccelX.textの割り当てを単純な文字列に変更するとエラーが停止するため、エラーを作成するオプションの変数は加速度計と関係があると思います。しかし、それは私が知る限りですので、何か提案があったり、私がそれを完全に間違っていて、より良い、より簡単な方法がある場合は、私を助けてくれれば間違いなく感謝します。

7
user4390998

NSHipsterには、コアモーションについて説明する良い記事があります: http://nshipster.com/cmdevicemotion/

モーションデータでUIを定期的に更新するためのより良い方法は、以下に示すようにパターンを使用することです。

if manager.accelerometerAvailable {
     manager.accelerometerUpdateInterval = 0.1
     manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) {
     [weak self] (data: CMAccelerometerData!, error: NSError!) in
          accelX.text = String(format: "%.2f", data.acceleration.x)
     }
}
9
Xiaojun

x、y、zの値を取得して、必要な値のアラートを出力できます

motionManager.accelerometerUpdateInterval = 5.0
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
        if let myData = data{
            print(myData)
            if myData.acceleration.y < -0.2{
                let alert = UIAlertController(title: "Message ", message: "new text", preferredStyle: UIAlertControllerStyle.alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
                self.present(alert, animated: true, completion: nil)

            }
        }
}
1
gihanshox