目前所知道的检测摇一摇动作的实现方式大概有三种,分别如下:
1. 事件模式:- motionBegan ,- motionEnded , - motionCancelled
在需要检测的控制器里面实现上面三个方法,可以检测到对应的状态。
需要准备工作由:如果App禁用的了摇一摇需要在控制器里面开启摇一摇检测:
a.[[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES];
b.[self becomeFirstResponder]
c.在viewDidDisappear方法里面取消第一响应,[self resignFirstResponder].
2.陀螺仪检测
UIAccelerometer,方法可能过时5.0之后就过期使用,使用也比较简单.
a.初始化陀螺仪并设置代理
UIAccelerometer * accelerometer = [UIAccelerometer sharedAccelerometer]; accelerometer.delegate = self; accelerometer.updateInterval = 0.1;//检测频率 _accelerometer = accelerometer;
b.实现代理方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { //综合3个方向的加速度 sqrt(平方根函数),pow(指数函数x的y次) double accelerameter = sqrt( pow( acceleration.x , 2 ) + pow( acceleration.y , 2 ) + pow( acceleration.z , 2) ); //当综合加速度大于2.3时,就激活效果(数据越小,用户摇动的动作就越小,越容易激活) if (accelerameter>2.3) { } }
3.CoreMotionManager
CoreMotionManager是一个比较全面的陀螺仪数据监测工具,可以检测加速度,引力加速度等比较完善的检测工具。
使用时,建议创建单例。导入CoreMotion.framework并导入头文件#import <CoreMotion/CoreMotion.h>
CMMotionManager *cmManager = [[CMMotionManager alloc] init]; cmManager.accelerometerUpdateInterval = 0.1; [cmManager startAccelerometerUpdates];//[_cmManager stopAccelerometerUpdates]; _cmManager = cmManager; [cmManager startAccelerometerUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) { CMAcceleration acceleration = accelerometerData.acceleration; //综合3个方向的加速度 sqrt(平方根函数),pow(指数函数x的y次) double accelerameter = sqrt( pow( acceleration.x , 2 ) + pow( acceleration.y , 2 ) + pow( acceleration.z , 2) ); //当综合加速度大于2.3时,就激活效果(数据越小,用户摇动的动作就越小,越容易激活) if (accelerameter>2.3) { } }];
使用时注意,app在后台挂起时,也有可能会一直在检测,所以需要对app的状态进行监听,后台模式可能需要停止监听了,毕竟监听陀螺仪是挺费电的操作。
另外如果想在摇动是有震动效果,可以导入 AudioToolbox.framework
导入#import <AudioToolbox/AudioServices.h>
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//播放震动