加速度與加速計(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對象實例,又被稱爲加速事件,它代表即時的三維空間上的加速度數據。該數據是沿着設備三個座標軸方向進行讀取的,這三個座標軸在設備上的走向如下:


加速度數據代表每個座標軸上的單位重力值。如果在某個座標軸上的值是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。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章