IOS 检测摇一摇动作的实现方式

  目前所知道的检测摇一摇动作的实现方式大概有三种,分别如下:

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

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

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//播放震动

你可能感兴趣的:(IOS)