iOS使用CoreMotion实现摇一摇功能

2020-01-21 06:15:48王振洲

第一步,为项目TARGET添加CoreMotion.framework

 iOS,CoreMotion,摇一摇

第二步,引入头文件


#import <CoreMotion/CoreMotion.h> 

第三步,使用CMMotionManager


@property (strong,nonatomic) CMMotionManager *motionManager; 

注意,当前应用只能有一个CMMotionManager实例,多个实例会影响接收速率

第四步,实例并初始化加速仪


self.motionManager = [[CMMotionManager alloc] init];//一般在viewDidLoad中进行 
self.motionManager.accelerometerUpdateInterval = .1;//加速仪更新频率,以秒为单位 

第五步,开始接收加速仪数据(startAccelerometerUpdatesToQueue:withHandler:)


-(void)viewDidAppear:(BOOL)animated 
{ 
  [self startAccelerometer]; 
} 
-(void)startAccelerometer 
{ 
  //以push的方式更新并在block中接收加速度 
  [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc]init] 
     withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
    [self outputAccelertionData:accelerometerData.acceleration]; 
    if (error) { 
      NSLog(@"motion error:%@",error); 
    } 
  }]; 
} 
-(void)outputAccelertionData:(CMAcceleration)acceleration 
{ 
  //综合3个方向的加速度 
  double accelerameter =sqrt( pow( acceleration.x , 2 ) + pow( acceleration.y , 2 ) 
     + pow( acceleration.z , 2) ); 
  //当综合加速度大于2.3时,就激活效果(此数值根据需求可以调整,数据越小,用户摇动的动作就越小,越容易激活,反之加大难度,但不容易误触发) 
  if (accelerameter>2.3f) { 
 //立即停止更新加速仪(很重要!) 
    [self.motionManager stopAccelerometerUpdates]; 
     
    dispatch_async(dispatch_get_main_queue(), ^{ 
      //UI线程必须在此block内执行,例如摇一摇动画、UIAlertView之类 
    }); 
  }   
} 
-(void)viewDidDisappear:(BOOL)animated 
{ 
  //停止加速仪更新(很重要!) 
  [self.motionManager stopAccelerometerUpdates]; 
}