目前大部份的 iOS 裝置都有支援 Magnetometer 指南針的功能,透過 Core Location 的Framework 就可以輕易取得 Magnetometer 當前的數值(角度),請看以下程式碼示範。
首先加入對應的 Framework,與標頭檔,如果不知道如何新增 Framework 的讀者們,可以參考 Xcode 4 新增 Framework 的方法一文。
#import <CoreLocation/CoreLocation.h>
之後在對應的 Class 中設定 CLLocationManagerDelegate 的代理方法,並增加一個 CLLocationManager 型態的指標 locationManager,如下(此範例是寫在 ViewCotroller 中)。
@interface MLViewController : UIViewController <CLLocationManagerDelegate> {
CLLocationManager *locationManager;
}
接著 回到程式碼中對 locationManager 進行初始化的動作,並且設定其更新的角度度數。
//locationManager初始化(已使用ARC機制)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
//設定需要重新定位的角度差距
locationManager.headingFilter = 3;
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];
完成上述設置之後,下面我們就可以開始使用 Framework 所提供的功能來取得指南針的角度讀數,每當指南針的角度變化大於上述所設定的角度差距,就會呼叫下列的內建函式。
//內建函式
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
//判斷magneticHeading的精準度
if (newHeading.headingAccuracy > 0) {
//取得角度值-磁北(0-北, 90-東, 180-南, 270-西)
CLLocationDirection theHeading = newHeading.magneticHeading;
//取得角度值-正北(0-北, 90-東, 180-南, 270-西)
//CLLocationDirection theHeading = newHeading.trueHeading;
NSLog(@"%f", theHeading);
} else {
NSLog(@"需校正");
}
}
上述程式碼中 headingAccuracy 是一個 double 形態的唯讀值,它代表了真正磁北與 magneticHeading 之間的誤差值,正常運作下 headingAccuracy 皆為正值,如果出現負數則代表 magneticHeading 要做 8 字形的校正。
若在使用上有需要系統做校正上的提示,可以使用下列內建函式,並回傳一個 YES 的布林值。
ps:有關 Core Location 的其它應用,可以參考使用 Core Location 做簡易的定位ㄧ文。
//內建函式
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager {
return YES;
}
ps:有關 Core Location 的其它應用,可以參考使用 Core Location 做簡易的定位ㄧ文。
沒有留言:
張貼留言