.h檔案
@interface ShakeViewController : UIViewController<UIAccelerometerDelegate>{ UIAccelerationValue myAccelerometer[3]; //是否響應搖一搖的標誌 BOOL _canShake; }
.m檔案中
#define kFilteringFactor 0.1#define kEraseAccelerationThreshold 2.0@implementation ShakeViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { _canShake = YES; } return self;}- (void)dealloc{ [UIAccelerometer sharedAccelerometer].delegate = nil; [super dealloc];}- (void)viewDidLoad{ [super viewDidLoad]; [UIAccelerometer sharedAccelerometer].delegate = self; [UIAccelerometer sharedAccelerometer].updateInterval = 1.0f/40.0f;}#pragma mark - UIAccelerometerDelegate- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{UIAccelerationValue length, x, y, z; if (!_canShake) { return; } //Use a basic high-pass filter to remove the influence of the gravity myAccelerometer[0] = acceleration.x * kFilteringFactor + myAccelerometer[0] * (1.0 - kFilteringFactor); myAccelerometer[1] = acceleration.y * kFilteringFactor + myAccelerometer[1] * (1.0 - kFilteringFactor); myAccelerometer[2] = acceleration.z * kFilteringFactor + myAccelerometer[2] * (1.0 - kFilteringFactor); // Compute values for the three axes of the acceleromater x = acceleration.x - myAccelerometer[0]; y = acceleration.y - myAccelerometer[0]; z = acceleration.z - myAccelerometer[0]; //Compute the intensity of the current acceleration length = sqrt(x * x + y * y + z * z); // If above a given threshold, play the erase sounds and erase the drawing view if(length >= kEraseAccelerationThreshold) { //是否響應搖一搖的標誌 _canShake = NO; [self shakeEvent]; }}