Objective-C

iPhoneで方位を取得する

iPhoneの動作検知について、少し勉強しています。
今回は、「方位」の検知に関して備忘録を残します。

やること
端末の位置情報から方位を取得し、簡単なコンパスを作ります
※ただ矢印の画像が回転するだけのサンプルです。
ライブラリは「CoreLocation」を使用します。

実装

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *manager;
@property (weak, nonatomic) IBOutlet UIImageView *compass;
@property (weak, nonatomic) IBOutlet UITextField *magneticHeading;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.manager = [[CLLocationManager alloc] init];
    self.manager.delegate = self;
    self.manager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    self.manager.distanceFilter = kCLDistanceFilterNone;

    // 位置情報取得開始
    [self.manager startUpdatingLocation];
    // コンパスのアニメーション開始
    [self.manager startUpdatingHeading];
}

//コンパスの矢印を回転させる(取得するたびに走る)
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading {

    if (heading.headingAccuracy < 0) {
        return;
    }

    CLLocationDirection theHeading = ((heading.trueHeading > 0) ? heading.trueHeading : heading.magneticHeading);

    // 取得した方位をテキストフィールドに入力
    self.magneticHeading.text = [NSString stringWithFormat:@"%f", theHeading];

    // 取得した方位を元にイメージを回転
    self.compass.transform = CGAffineTransformMakeRotation(-heading.magneticHeading * M_PI/180);
}

@end

所感

改めてiPhoneの動作検知機能の素晴らしさに気づかされました。様々なモーションデータを数行で取得できるんですね。その他、「高度」「速度」なんかも取得できるみたいです。流行りの「顔認証」技術なども合わせて、今後も勉強を続けます。