我是Device Motion資料,我由加速器、陀螺儀和磁力儀等3個資訊組合而成,用以表示姿勢、重力方向、加速器資料、磁場資料,其中最重要的姿勢表示XYZ三軸固定旋轉的狀況,分別為pitch、roll、yaw
Device Motion資料包含姿勢、重力方向、加速器資料、磁場資料等資料,分別對應的屬性為attitude、gravity、userAcceleration、rotationRate與magneticField。其中姿勢attitude含有3個屬性pitch、roll與yaw,用以表示XYZ軸固定後旋轉的狀況。
第1步:建立一個名為"DeviceMotion"專案。
第2步:設置畫面與IBOutlet
- 如入6個UILabel標籤,用以表示X、Y、Z軸的標題與值
- 為表示X、Y、Z值的UILabel標籤設置Outlet,分別是xLabel、yLabel與zLabel
第3步:加入CoreMotion.framework至專案中
- 選取TARGETS中的預設Target - DeviceMotion,選Build Phases後按"+"號
- 搜尋CoreMotion,在選取framework後按Add
第4步:透過CMotionManager取得Device Motion資料
- 於ViewController.h檔中,引用CoreMotion.h
- 並加入motionManager實體變數,以存放後續取得的CMMotionManager物件
ViewController.h
#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface ViewController : UIViewController
{
CMMotionManager *motionManager;
}
@property (strong, nonatomic) IBOutlet UILabel *xLabel;
@property (strong, nonatomic) IBOutlet UILabel *yLabel;
@property (strong, nonatomic) IBOutlet UILabel *zLabel;
@end
- ViewController.m檔中的viewDidLoad方法中,透過CMotionManager取得Device Motion資料
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
//建立CMMotionManager物件
motionManager = [[CMMotionManager alloc] init];
//取得目前的執行緒駐列
NSOperationQueue * queue = [NSOperationQueue currentQueue];
//透過startDeviceMotionUpdatesToQueue開始取得XYZ軸的DeviceMotion,
//參數1帶入queue,以在此執行緒駐列執行取得資料的block,
//參數2即為一個block,其中將取得的XYZ軸固定後的旋轉弧度值pitch、roll、yaw
[motionManager startDeviceMotionUpdatesToQueue:queue
withHandler:^(CMDeviceMotion *motion, NSError *error) {
//在此透過公式:弧度 x 180 / 兀,
//將弧度轉為角度
float pitch = motion.attitude.pitch * 180 / M_PI;
float roll = motion.attitude.roll * 180 / M_PI;
float yaw = motion.attitude.yaw * 180 / M_PI;
self.xLabel.text =
[NSString stringWithFormat:@"%2.0f", pitch];
self.yLabel.text =
[NSString stringWithFormat:@"%2.0f", roll];
self.zLabel.text =
[NSString stringWithFormat:@"%2.0f", yaw];
}];
}
第5步:執行
- 以實機執行,分別可分別固定XYZ軸,然後轉動,以查看值的變化
檔案連結:DeviceMotion.zip