2016/4/10追記:Swift 2.2のコードを追記しました
Core Motionを使って、加速度センサーを使用する方法をメモしておきます。
このセンサーを使用することでx、y、z軸に沿った速度の変化を測定することができます。
(iOSイベント処理ガイドより)
実装方法
まずは「CoreMotion.framework」を追加します。
ヘッダをインポートします。
Swift:
import CoreMotion
#import <CoreMotion/CoreMotion.h>
インスタンスを生成します。
Swift:
let manager = CMMotionManager()
_motionManager = [[CMMotionManager alloc] init];
適切な更新間隔を設定をして加速度センサーを有効化します。
Swift:
if manager.accelerometerAvailable { // センサーの更新間隔の指定 manager.accelerometerUpdateInterval = 1 / 10; // 10Hz // ハンドラを指定 let accelerometerHandler:CMAccelerometerHandler = { [weak self] (data: CMAccelerometerData?, error: NSError?) -> Void in self?.xLabel.text = "".stringByAppendingFormat("x %.4f", data!.acceleration.x) self?.yLabel.text = "".stringByAppendingFormat("y %.4f", data!.acceleration.y) self?.zLabel.text = "".stringByAppendingFormat("z %.4f", data!.acceleration.z) print("x: \(data!.acceleration.x) y: \(data!.acceleration.y) z: \(data!.acceleration.z)") } // 加速度の取得開始 manager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: accelerometerHandler) }
if (_motionManager.accelerometerAvailable) { // センサーの更新間隔の指定 _motionManager.accelerometerUpdateInterval = 1 / 10; // 10Hz // ハンドラを指定 CMAccelerometerHandler handler = ^(CMAccelerometerData *data, NSError *error) { // 画面に表示 self.xLabel.text = [NSString stringWithFormat:@"x %f", data.acceleration.x]; self.yLabel.text = [NSString stringWithFormat:@"y %f", data.acceleration.y]; self.zLabel.text = [NSString stringWithFormat:@"z %f", data.acceleration.z]; }; // 加速度の取得開始 [_motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:handler]; }
加速度イベントの一般的な更新間隔(iOSイベント処理ガイドより)
イベント頻度(Hz) | 用途 |
---|---|
10~20 | デバイスの向きベクトルを調べる目的。 |
30〜60 | ゲームその他、実時間のユーザ入力用に加速度センサーを用いるアプリケーション。 |
70〜100 | 高い頻度でモーションを検出する必要があるアプリケーション。デバイスを叩く、激しく振る、などの操作を検出する使い方が考えられます。 |
startAccelerometerUpdatesToQueue
メソッドを実行すると、指定した更新間隔でハンドラの内容が実行されます。
加速度センサーを無効化するには次のメソッドを実行します。
Swift:
if manager.accelerometerAvailable {
manager.stopAccelerometerUpdates()
}
if (_motionManager.accelerometerActive) {
[_motionManager stopAccelerometerUpdates];
}
サンプルコード
- https://github.com/koogawa/iSensor/blob/master/iSensor/AccelerometerViewController.m
- https://github.com/koogawa/iSensorSwift/blob/master/iSensorSwift/Controller/AccelerometerViewController.swift
注意点
- iOS 4以上で使用できます
応用できそうなアプリ
- iPhoneの傾きによって物体が転がるゲーム
私がリリースしているiOSアプリ「まりも」では、加速度センサーを利用して「まりも」を転がしています。