http://blog.csdn.net/wanjf_912/article/details/9305357
备注:以下内容仅适用于iOS 2.0至iOS 4.0版本的SDK。但以下内容中涉及到的概念依然适用于iOS 4.0以后版本的SDK。自iOS 5.0开始,以下内容被放在了Core Motion框架里,且对数据的访问做了统一地管理,同时对数据做了重新定义,比如UIAcceleration已由CMAccelerometerData接管,UIAccelerometer已由CMMotionManager接管,而UIAccelerometerDelegate委托则可以认为是由CMAceelerometerHandler类型的块回调所替代。,
加速度实为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类定义符合UIAccelerometerDelegate委托以接收加速度数据。
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
让该类成为加速度的委托,并实现委托要求的可选方法,虽是可选的,但如果要接收加速事件则必须实现该方法。同时,如果应用运行在模拟器上运行时,则提示:Sorry, the app should run on a device.
xib文件则很简单,用三个UILable分别显示三个坐标轴上的加速度数据。
让ViewController类的四个UILabel输出口属性和xib内的三个UILabel对象建立关联即可。同时让xib内最后一个UILabel对象的Label组合框下的Lines值设置为2。