要做一個搖獎的功能,持續搖晃2、4、6分別得到不同的禮物,檢測搖動時間的代碼如下:
CMMotionManager *_motionManager = [[CMMotionManager alloc] init];
NSOperationQueue *_operationQueue = [[NSOperationQueue alloc] init];
BOOL _isShake; // 是否在搖動
BOOL _isOver = NO; // 是否搖動已經結束
NSInteger _beginTimestamp = 0; // 開始搖獎的時間戳
_motionManager.accelerometerUpdateInterval = 1;
- (void)initShake {
[_motionManager startAccelerometerUpdatesToQueue:_operationQueue withHandler:^(CMAccelerometerData *latestAcc, NSError *error) {
dispatch_sync(dispatch_get_main_queue(), ^(void) {
// 所有操作進行同步
@synchronized(_motionManager) {
_isShake = [self isShake:_motionManager.accelerometerData];
if (_beginTimestamp == 0 && _isShake == YES) {
NSLog(@"搖獎開始了");
_beginTimestamp = [[NSDate date] timeIntervalSince1970];
}
if (_beginTimestamp != 0 && _isShake == NO) {
_isOver = YES;
}
// 此時為搖獎結束
if (_isOver) {
// 停止檢測搖動事件
[_motionManager stopAccelerometerUpdates];
// 取消隊列中排隊的其它請求
[_operationQueue cancelAllOperations];
NSInteger currentTimestamp = [[NSDate date] timeIntervalSince1970];
// 搖動的持續時間
NSInteger second = currentTimestamp - _beginTimestamp;
NSLog(@"搖一搖結束, 持續時間為:%d", second);
}
}
});
}];
}
- (BOOL)isShake:(CMAccelerometerData *)newestAccel {
BOOL isShake = NO;
// 三個方向任何一個方向的加速度大於1.5就認為是處於搖晃狀態,當都小於1.5時認為搖獎結束。
if (ABS(newestAccel.acceleration.x) > 1.5 || ABS(newestAccel.acceleration.y) > 1.5 || ABS(newestAccel.acceleration.z) > 1.5) {
isShake = YES;
}
return isShake;
}