加速度与加速计(UIAcceleration类,UIAccelerometer类及UIAccelerometerDelegate委托)

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文件

  1. //  
  2. //  ViewController.h  
  3. //  UIAccemerometerSample  
  4. //  
  5. //  Created by jiafu wan on 7/13/13.  
  6. //  Copyright (c) 2013 jiafu wan. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #define  kUpdateFrequency  60.0  
  11. @interface ViewController : UIViewController<UIAccelerometerDelegate>  
  12. @property(nonatomic, retain) IBOutlet UILabel *gOnAxis_X;  
  13. @property(nonatomic, retain) IBOutlet UILabel *gOnAxis_Y;  
  14. @property(nonatomic, retain) IBOutlet UILabel *gOnAxis_Z;  
  15. @property(nonatomic, retain) IBOutlet UILabel *warning;  
  16. @end  

要让ViewController类定义符合UIAccelerometerDelegate委托以接收加速度数据。

ViewController.m文件

  1. //  
  2. //  ViewController.m  
  3. //  UIAccemerometerSample  
  4. //  
  5. //  Created by jiafu wan on 7/13/13.  
  6. //  Copyright (c) 2013 jiafu wan. All rights reserved.  
  7. //  
  8.   
  9. #import "ViewController.h"  
  10.   
  11. @interface ViewController ()  
  12.   
  13. @end  
  14.   
  15. @implementation ViewController  
  16. @synthesize gOnAxis_X, gOnAxis_Y, gOnAxis_Z, warning;  
  17.   
  18. - (void)viewDidLoad  
  19. {  
  20.     [super viewDidLoad];  
  21.     // Do any additional setup after loading the view, typically from a nib.  
  22.     [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0/kUpdateFrequency];  
  23.     [[UIAccelerometer sharedAccelerometer] setDelegate:self];  
  24. #if TARGET_IPHONE_SIMULATOR  
  25.     self.warning.text = @"Sorry, the app should run on a device.";  
  26. #endif  
  27. }  
  28.   
  29. - (void)didReceiveMemoryWarning  
  30. {  
  31.     [super didReceiveMemoryWarning];  
  32.     // Dispose of any resources that can be recreated.  
  33. }  
  34. - (void)dealloc  
  35. {  
  36.     [gOnAxis_X release];  
  37.     [gOnAxis_Y release];  
  38.     [gOnAxis_Y release];  
  39.     [warning release];  
  40.     [super dealloc];  
  41. }  
  42. #pragma mark - delegate method  
  43. - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration  
  44. {  
  45.     self.gOnAxis_X.text = [self.gOnAxis_X.text stringByAppendingFormat:@" %0.2f", acceleration.x];  
  46.     self.gOnAxis_Y.text = [self.gOnAxis_Y.text stringByAppendingFormat:@" %0.2f", acceleration.y];  
  47.     self.gOnAxis_Z.text = [self.gOnAxis_Z.text stringByAppendingFormat:@" %0.2f", acceleration.z];  
  48. }  
  49. @end  

让该类成为加速度的委托,并实现委托要求的可选方法,虽是可选的,但如果要接收加速事件则必须实现该方法。同时,如果应用运行在模拟器上运行时,则提示:Sorry, the app should run on a device.

xib文件则很简单,用三个UILable分别显示三个坐标轴上的加速度数据。



让ViewController类的四个UILabel输出口属性和xib内的三个UILabel对象建立关联即可。同时让xib内最后一个UILabel对象的Label组合框下的Lines值设置为2。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值