#import "ViewController.h" #import <CoreMotion/CoreMotion.h> #import "UIView+Extension.h" #import "AudioTool.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *ball; @property(nonatomic ,strong)CMMotionManager * manager; //记录小球在X , Y 方向的加速度 @property(nonatomic ,assign)CGPoint speed; //记录小球的坐标 @property(nonatomic ,assign)CGPoint loc ; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //创建运动事件管理者 CMMotionManager * manager = [[CMMotionManager alloc]init]; //使用一个属性来延长manager的生命周期 (否则block无法执行) self.manager = manager; //设置加速计数据更新间隔 manager.accelerometerUpdateInterval = 1/30; //开始监测加速计数据更新 [manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) { NSLog(@"%f , %f , %f" , accelerometerData.acceleration.x , accelerometerData.acceleration.y , accelerometerData.acceleration.z); //我们要通过加速度 算出每一时刻小球的移动距离 //也就是 要通过 上一时间的位移+加速度 = 此时的位移量 //每一时刻的加速度 _speed.x += accelerometerData.acceleration.x; //因为加速计的坐标的Y方向与手机坐标的Y是相反的 _speed.y -= accelerometerData.acceleration.y; //更新小球的frame 的x , y 值 self.ball.x += self.speed.x; self.ball.y += self.speed.y; //判断小球的坐标, 不让小球移除屏幕范围 if (self.ball.x <= 0 ) { self.ball.x = 0; //让小球减速,因为加速一直变大, 小球的速度也就越快,位移也就越大,屏幕就无法捕捉到小球移动了 _speed.x *= -0.5; } if (self.ball.x >= self.view.width - self.ball.width) { self.ball.x = self.view.width - self.ball.width; _speed.x *= -0.5; } if (self.ball.y <= 0) { self.ball.y = 0; _speed.y *= -0.5; } if (self.ball.y >= self.view.height - self.ball.height) { self.ball.y = self.view .height - self.ball .height; _speed.y *= -0.5; } //判断小球是否碰撞到边缘 if (self.ball.x ==0 || self.ball.x == self.view.width - self.ball.width || self.ball.y == 0 || self.ball.y == self.view.height - self.ball.height) { if (self.ball.x == self.loc.x || self.ball.y == self.loc.y) { }else{ //播放音乐 [AudioTool playWithFileName:@"1.aif"]; } } //记录小球位置 _loc.x = self.ball.x; _loc.y = self.ball.y; }]; }
以上是CoreMotion框架实现加速计的demo,下面是已经过期的API 实现加速计的代码:
iOS 5.0 推出的UIAccelerometer 后不更新 被CoreMotion 框架替代
•加速计使用步骤
–1. 获取共享加速计对象
–2. 设置加速计数据更新频率
–3. 设置加速计对象代理
//检测 手机 三个方向 上的加速度值
//重力加速度
//加速计 设备 一个 硬件设备
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
self.accelerometer = accelerometer;
accelerometer.updateInterval = 1/30.0;
//设置代理
accelerometer.delegate = self;
}
//更新了 加速度的值 就会调用 参数1 加速计 参数2 返回值
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
NSLog(@"%f %f %f",acceleration.x,acceleration.y,acceleration.z);
}