Может быть, следующий код поможет вам.Я нашел это некоторое время назад (не помню где) и убрал это.Вы можете настроить значения в didAccelerate, в настоящее время это 0,8 и 0,2, чтобы определить, насколько чувствительно оно к встряхиванию и насколько устойчиво вы должны держать устройство, чтобы иметь возможность снова встряхивать.
Заголовок
@protocol ShakeHelperDelegate
-(void) onShake;
@end
@interface ShakeHelper : NSObject <UIAccelerometerDelegate>
{
BOOL histeresisExcited;
UIAcceleration* lastAcceleration;
NSObject<ShakeHelperDelegate>* delegate;
}
+(id) shakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del;
-(id) initShakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del;
@end
Реализация
#import "ShakeHelper.h"
@interface ShakeHelper (Private)
@end
@implementation ShakeHelper
// Ensures the shake is strong enough on at least two axes before declaring it a shake.
// "Strong enough" means "greater than a client-supplied threshold" in G's.
static BOOL AccelerationIsShaking(UIAcceleration* last, UIAcceleration* current, double threshold)
{
double
deltaX = fabs(last.x - current.x),
deltaY = fabs(last.y - current.y),
deltaZ = fabs(last.z - current.z);
return
(deltaX > threshold && deltaY > threshold) ||
(deltaX > threshold && deltaZ > threshold) ||
(deltaY > threshold && deltaZ > threshold);
}
+(id) shakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del
{
return [[[self alloc] initShakeHelperWithDelegate:del] autorelease];
}
-(id) initShakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del
{
if ((self = [super init]))
{
delegate = del;
[UIAccelerometer sharedAccelerometer].delegate = self;
}
return self;
}
-(void) accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
if (lastAcceleration)
{
if (!histeresisExcited && AccelerationIsShaking(lastAcceleration, acceleration, 0.8))
{
histeresisExcited = YES;
[delegate onShake];
}
else if (histeresisExcited && !AccelerationIsShaking(lastAcceleration, acceleration, 0.2))
{
histeresisExcited = NO;
}
}
[lastAcceleration release];
lastAcceleration = [acceleration retain];
}
-(void) dealloc
{
CCLOG(@"dealloc %@", self);
[UIAccelerometer sharedAccelerometer].delegate = nil;
[lastAcceleration release];
[super dealloc];
}
@end
Вы используете это так:
[ShakeHelper shakeHelperWithDelegate:self];
Очевидно, что объект self должен реализовывать протокол ShakeHelperDelegate.Сообщение onShake будет отправлено объекту делегата при обнаружении сотрясения.