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


备注:以下内容仅适用于iOS 2.0至iOS 4.0版本的SDK。但以下内容中涉及到的概念依然适用于iOS 4.0以后版本的SDK。自iOS 5.0开始,以下内容被放在了Core Motion框架里,且对数据的访问做了统一地管理,同时对数据做了重新定义,比如UIAcceleration已由CMAccelerometerData接管,UIAccelerometer已由CMMotionManager接管,而UIAccelerometerDelegate委托则可以认为是由CMAceelerometerHandler类型的块回调所替代。

加速度实为UIAcceleration对象实例,又被称为加速事件,它代表即时的三维空间上的加速度数据。该数据是沿着设备三个坐标轴方向进行读取的,这三个坐标轴在设备上的走向如下:

加速度与加速计(UIAcceleration类,UIAccelerometer类及UIAccelerometerDelegate委托)_第1张图片

加速度数据代表每个坐标轴上的单位重力值。如果在某个坐标轴上的值是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设置的设备上运行时并且让设备屏幕向上水平放置,那么行的结果应该如下图所示:

加速度与加速计(UIAcceleration类,UIAccelerometer类及UIAccelerometerDelegate委托)_第2张图片


下面是代码部分部分:

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分别显示三个坐标轴上的加速度数据。

加速度与加速计(UIAcceleration类,UIAccelerometer类及UIAccelerometerDelegate委托)_第3张图片


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





你可能感兴趣的:(ios,UIKit,UIAccelerometer,UIAcceleration)