你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 晃動手勢

iOS 晃動手勢

編輯: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];

[selfviewWillDisappear: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:@"123"repeats: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(@"檢測到晃動");

}

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

}

不管push還是pull方法在最後一定要記得調用CoreMotion實例的 stopAccelerometerUpdates方法([cmManager stopAccelerometerUpdates]),停止CoreMotion實例更新。

OK,可以晃動手機測試測試了^_^…

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

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved