2016/4/2追記:Swift編はこちら
磁力センサーを利用し、iPhoneの向きを計測する方法を解説します。
「磁北」と「真北」について
単純に「北」と言っても、「磁北(じほく)」と「真北(しんぽく)」の二種類が存在します(2つの違いについては「真北とは? | 用語集とGISの使い方 | 株式会社パスコ」で丁寧に解説されています)。
ここでは磁北を取得する方法について解説します。
実装方法
まずは「CoreLocation.framework」を追加します。
次にヘッダをインポートします。
#import <CoreLocation/CoreLocation.h>
CLLocationManagerDelegateプロトコルも宣言しておきます。
@interface ViewController : UIViewController <CLLocationManagerDelegate> @end
ヘディングイベントの取得を開始します。
if ([CLLocationManager headingAvailable]) { // インスタンスを生成 _locationManager = [[CLLocationManager alloc] init]; // デリゲートを設定 _locationManager.delegate = self; // 何度動いたら更新するか(デフォルトは1度) _locationManager.headingFilter = kCLHeadingFilterNone; // デバイスのどの向きを北とするか(デフォルトは画面上部) _locationManager.headingOrientation = CLDeviceOrientationPortrait; // ヘディングイベントの開始 [_locationManager startUpdatingHeading]; }
この状態でiPhoneの向きが変わると、次のメソッドが呼ばれます。
// デバイスの方位が変わるたびに呼ばれる - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { CLLocationDirection heading = newHeading.magneticHeading; self.textField.text = [NSString stringWithFormat:@"%.2f", heading]; }
magneticHeading
には 0.0 から 359.9 の値が入ります。北の方向がちょうど 0.0 になり、それから東、南、西の順に値が増えていき、北に戻ると再び 0.0 に戻ります。
方角 | 値 |
---|---|
北 | 0.0 |
東 | 90.0 |
南 | 180.0 |
西 | 270.0 |
ヘディングイベントの取得を停止するには次のメソッドを実行します。
if ([CLLocationManager headingAvailable]) {
[_locationManager stopUpdatingHeading];
}
イベントの取得が不要になったら、忘れずに停止しておきましょう。
サンプルコード
注意点
- iOS 4 以降で使用できます
- iPod touch には磁力センサーがないため、電子コンパスは利用できません
応用できそうなアプリ
- 道案内アプリ
- 電子コンパスを絡めたゲームなど