iOS 晃动手势

让当前的程序 检测手机晃动的方法大体上有两种;第一种方法就是重写UIResponder类下的手势方法(可以用模拟器模拟),第二种方法就是利用Accelerometer来检测手机是否晃动(只能用真机测试)。

第一种方法:

很简单只需三个步骤:让当前ViewController支持晃动手势,让当前的View成为第一响应者,重写UIResponder中支持晃动的3个方法。

1、让当前的ViewController支持晃动;
 sample code:

- (void)viewDidLoad

{

    [superviewDidLoad];

    // 支持shake

    [[UIApplicationsharedApplication]setApplicationSupportsShakeToEdit:YES];

}


2、让当前的View成为第一响应者;
 sample code:

-(BOOL)canBecomeFirstResponder

{// 默认值是 NO

    return YES;

}

-(void)viewDidAppear:(BOOL)animated

{

    [superviewDidAppear:animated];

    [selfbecomeFirstResponder];

}

-(void)viewWillDisappear:(BOOL)animated

{

    [selfresignFirstResponder];

    [superviewWillDisappear:animated];

}



3、重写下面的方法,并在相应的方法中添加手机晃动时需要执行的代码。

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event//开始晃动

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event//晃动结束

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event//取消晃动


第二种方法:

其实根据acceleration判断手机是否晃动,细分又可分为两种,也可认为是一种。

 闲话少说直接上代码:

 1>使用UIAccelerometer对象检测手机是否晃动(iOS5.0及以后不推荐使用但仍然可以用,只是会有警告提示)

// 创建 UIAccelerometer实例

UIAccelerometer *accelerometer = [UIAccelerometersharedAccelerometer];

accelerometer.updateInterval =0.1;

accelerometer.delegate =self;

// 实现UIAccelerometer实例的代理方法

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration

{ // iOS5.0 以后不推荐使用

   if (fabs(acceleration.x)>2.0 ||fabs(acceleration.y)>2.0 ||fabs(acceleration.z)>2.0) {

       NSLog(@"检测到晃动");

    }

}

 2>使用CoreMotion框架,根据acceleration值来判断手机是否晃动。(CoreMotion框架是苹果推荐开发者使用的,用来替代UIAccelerometer;最后我会再粘贴一个介绍CoreMotion框架的链接,感觉讲的不错

 使用CMMotionManager来获取accelerometer、gyro、deviceMotion等的信息,有push和pull两种方式,关于这两种方式的优缺点可以在网上查找。

   1、push方式获取acceleration数据,以下代码可以放到-(void)viewDidLoad方法中。

    CMMotionManager *cmManager = [[CMMotionManageralloc]init];

    if (!cmManager.accelerometerAvailable) {

        NSLog(@"CMMotionManager unavailable");

    }

    cmManager.accelerometerUpdateInterval =0.1; // 数据更新时间间隔

    [cmManager startAccelerometerUpdatesToQueue:[NSOperationQueuecurrentQueue]withHandler:^(CMAccelerometerData *accelerometerData,NSError *error) {

       double x = accelerometerData.acceleration.x;

       double y = accelerometerData.acceleration.y;

       double z = accelerometerData.acceleration.z;

        

       if (fabs(x)>2.0 ||fabs(y)>2.0 ||fabs(z)>2.0) {

           NSLog(@"检测到晃动");

        }

        NSLog(@"CoreMotionManager, x: %f,y: %f, z: %f",x,y,z);

    }];

    

     2、pull方式获取acceletation数据,需要自己实现计时器功能。以下代码可以放到-(void)viewDidLoad方法中。

    CMMotionManager *cmManager = [[CMMotionManageralloc]init];

    if (!cmManager.accelerometerAvailable) {

        NSLog(@"CMMotionManager unavailable");

    }

    cmManager.accelerometerUpdateInterval =0.1f;

    [cmManager startAccelerometerUpdates];

    timer = [NSTimerscheduledTimerWithTimeInterval:0.2ftarget:selfselector:@selector(updateAcceleration:)userInfo:nilrepeats:YES];

    [timerfire];

    自定义方法updateAcceleration:

-(void)updateAcceleration:(id)userInfo

{

    CMAccelerometerData *accelData =cmManager.accelerometerData;

   double x = accelData.acceleration.x;

   double y = accelData.acceleration.y;

   double z = accelData.acceleration.z;

    

   if (fabs(x)>2.0 ||fabs(y)>2.0 ||fabs(z)>2.0) {

       NSLog(@"检测到晃动");

    }

}

   不管push还是pull方法在最后一定要记得调用CoreMotion实例的 stopAccelerometerUpdates方法([cmManager stopAccelerometerUpdates]),停止CoreMotion实例更新。

    OK,可以晃动手机测试测试了^_^…

介绍CoreMotion不错的文章: http://www.cocoachina.com/iphonedev/sdk/2010/0811/1996.html

你可能感兴趣的:(ios,ios,晃动,shake,motionBegan,motionEnded,motionCancelled)