目前所知道的检测摇一摇动作的实现方式大概有三种,分别如下: 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);//播放震动
|