備註:以下內容僅適用於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。