一、概述
加速计是用来检测手机受到加速度的大小和方向的,而手机静止的时候只受到重力加速度,所以很多人把加速计功能有叫做重力感应功能。加速计的强项在于测量设备的重力方向。
iPhone提供了内置的加速计,也叫方向感应器,是通过感知特定方向的惯力总量,测量出加速度和重力的,是 iOS很重要的特色功能之一。感应器通过跟踪设备在其X、Y、Z轴上的重力加速度的方向,检测到设备当前的方向比如是平放着还是测立着,平放时正面向上还是向下,手持时home键所处的四个方向等;也可以通过侦测加速度来移 动屏幕上的对象;也可以通过加速计侦测晃动事件。接下里就详细介绍一下对应的类UIAccelerometer。
二、UIAccelerometer类
1、获取UIAccelerometer的实例,并进行相应的设置
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UIAccelerometer *acceler = [UIAccelerometer sharedAccelerometer];
[acceler setUpdateInterval:0.1]; // 设置感应器更新数据的时间间隔
[acceler setDelegate:self]; // 设置代理
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[UIAccelerometer sharedAccelerometer] setDelegate:nil];
}
注:在应用加速计的视图消失时,应该 停止感应器数据的更新,这样感应器的硬件也会关闭,从而也能 起到节约电池的作用。
2、实现代理方法,获取数据
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
NSLog(@“%f,%f,%f”,[acceleration x], [acceleration y], [acceleration z]);
}
注:通过改变手机的手持方式或摇动手机,观察控制台的输出变化。
3、侦测晃动事件
用加速计侦测晃动事件,需要在收到重力加速计的数据后做一些复杂的数学运算才能很好的实现,但是, UIResponder给我们提供了这些工作,我们只需使用下面的接口:
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
// 晃动开始触发的方法
}
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent*)event
{
// 晃动结束时调用
}
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent*)event
{
// 晃动中断时调用
}
// 由于窗口对象的第一响应者会收到所有的运动事件,为了确保应用当前视图控制器类为第一响应者,做如下两 个操作
-(BOOL)canBecomeFirstResponder
{
return YES;
}
-(void)viewWillAppear:(BOOL)animated
{
CMMotionManager;
[super viewWillAppear:animated];
UIAceelerometer *acceler = [UIAccelerometer sharedAccelerometer];
[acceler setUpdateInterval:0.1];
[acceler setDelegate:self];
[self.view becomeFirstResponder]; // 窗口对象作为第一响应者响应运动事件
}