加速度实为UIAcceleration对象实例,又被称为加速事件,它代表即时的三维空间上的加速度数据。该数据是沿着设备三个坐标轴方向进行读取的,这三个坐标轴在设备上的走向如下:
加速度数据代表每个坐标轴上的单位重力值。如果在某个坐标轴上的值是1,则代表在该坐标轴上为+1g的加速度。比如,当设备屏幕朝上静止地放在水平面上时,每个加速度数据都是:x = 0.0, y = 0.0, z = -1.0。因此,通过加速度数据我们可以获得设备的朝向,以及运动方向。
当然,这些加速度数据并不是现实物理运动所产生的精确值,所以你不能手拿一个台iphone去测在超重和失重时你所受的重力加速度是多少。
如果要接收加速事件,则需要了解另外一个物理概念,即加速计。它是UIAccelerometer对象实例,但我们不能直接创建它,可以通过它的类法sharedAccelerometer来获取系统共享的UIAccelerometer对象实例。
它有一个委托属性,一旦对它进行了赋值,加速事件就会以一定的频率被送递给该委托对象。加速度数据的更新频率要依机载硬件而定,因此它有个最大的更新频率值。当我们设置了委托后,可以设定一个更新频率,但该频率不能超过最大的更新频率。
下面,我们创建一个名为UIAccemerometerSample的简单的应用来示范如何获取获取设备的加速度数据。这里省略了工程的创建过程,有一点需要提醒的是,创建时不要勾选自动引用计数选项,工程创建后把工程的TARGETS下的Deployment Target设置为4.3(或位于[2.0, 5.0)之间的其他SDK版本)。
如果该应用在一台符合Deployment Target设置的设备上运行时并且让设备屏幕向上水平放置,那么行的结果应该如下图所示:
下面是代码部分部分:
ViewController.h文件
// // ViewController.h // UIAccemerometerSample // // Created by jiafu wan on 7/13/13. // Copyright (c) 2013 jiafu wan. All rights reserved. // #import <UIKit/UIKit.h> #define kUpdateFrequency 60.0 @interface ViewController : UIViewController<UIAccelerometerDelegate> @property(nonatomic, retain) IBOutlet UILabel *gOnAxis_X; @property(nonatomic, retain) IBOutlet UILabel *gOnAxis_Y; @property(nonatomic, retain) IBOutlet UILabel *gOnAxis_Z; @property(nonatomic, retain) IBOutlet UILabel *warning; @end
ViewController.m文件
// // ViewController.m // UIAccemerometerSample // // Created by jiafu wan on 7/13/13. // Copyright (c) 2013 jiafu wan. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize gOnAxis_X, gOnAxis_Y, gOnAxis_Z, warning; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0/kUpdateFrequency]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; #if TARGET_IPHONE_SIMULATOR self.warning.text = @"Sorry, the app should run on a device."; #endif } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)dealloc { [gOnAxis_X release]; [gOnAxis_Y release]; [gOnAxis_Y release]; [warning release]; [super dealloc]; } #pragma mark - delegate method - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { self.gOnAxis_X.text = [self.gOnAxis_X.text stringByAppendingFormat:@" %0.2f", acceleration.x]; self.gOnAxis_Y.text = [self.gOnAxis_Y.text stringByAppendingFormat:@" %0.2f", acceleration.y]; self.gOnAxis_Z.text = [self.gOnAxis_Z.text stringByAppendingFormat:@" %0.2f", acceleration.z]; } @end
xib文件则很简单,用三个UILable分别显示三个坐标轴上的加速度数据。
让ViewController类的四个UILabel输出口属性和xib内的三个UILabel对象建立关联即可。同时让xib内最后一个UILabel对象的Label组合框下的Lines值设置为2。