UIAccelerometer在iOS5已經被標記為過期方法,但由於它非常簡單,並不影響我們學習使用。在iOS5之后我們可以使用Core Motion framework
加速計有什么用?
- 檢測設備的運動
應用場景
- 搖一搖
- 計步器
加速計的原理
- 檢測設備在X、Y、Z軸上的加速度 (哪個方向有力的作用,哪個方向運動了)
- 根據加速度數值,就可以判斷出在各個方向上的作用力度
加速計的加速度范圍為-1到1,因為設備正常情況下會受到重力影響,所以在上述幾種情況中會有向下的為1的加速度
新建工程,我們在ViewDidLoad中加入以下代碼
1 //獲得單例對象 2 UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; 3 //設置代理 4 accelerometer.delegate = self; 5 //設置采樣間隔 1/60.0 就是 1秒采集60次 6 accelerometer.updateInterval = 1 / 60.0;
實現代理方法
1 -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 2 { 3 NSLog(@"x加速度%f--y加速度%f--z加速度%f",acceleration.x,acceleration.y,acceleration.z); 4 }
代理方法給我們返回了加速計對象和結果對象,運行程序結果如下
1 2015-02-10 11:11:06.168 UIAccelerometer[1147:60b] x加速度-0.060181--y加速度0.094147--z加速度-0.988922 2 2015-02-10 11:11:06.186 UIAccelerometer[1147:60b] x加速度-0.059189--y加速度0.093430--z加速度-0.987961 3 2015-02-10 11:11:06.204 UIAccelerometer[1147:60b] x加速度-0.059387--y加速度0.092224--z加速度-0.987488 4 2015-02-10 11:11:06.221 UIAccelerometer[1147:60b] x加速度-0.061752--y加速度0.092514--z加速度-0.987228 5 2015-02-10 11:11:06.239 UIAccelerometer[1147:60b] x加速度-0.057999--y加速度0.092453--z加速度-0.988937 6 2015-02-10 11:11:06.257 UIAccelerometer[1147:60b] x加速度-0.060883--y加速度0.095367--z加速度-0.985062 7 2015-02-10 11:11:06.275 UIAccelerometer[1147:60b] x加速度-0.058121--y加速度0.095779--z加速度-0.988708 8 2015-02-10 11:11:06.292 UIAccelerometer[1147:60b] x加速度-0.060349--y加速度0.093201--z加速度-0.986755 9 2015-02-10 11:11:06.310 UIAccelerometer[1147:60b] x加速度-0.054764--y加速度0.093338--z加速度-0.990158
我們看到設備平放,在Z軸負方向受到大約為-1的加速度
初步了解了加速計的用法,接下來我們做一個程序,屏幕上有一個小球,可以隨着重力上下左右移動,我們先在屏幕上畫一個小球,並在控制器中連線
1 @property (weak, nonatomic) IBOutlet UIImageView *ball;
讓小球運動就是修改小球的x,y,我們怎么讓x,y和加速度發生關系呢
初中物理我們學過,位移=速度*時間=加速度*時間*時間,因為我們設置了采樣率為1/60,所以每次調用代理方法的時間為1/60秒,所以每個時刻的瞬時速度為加速度的累加,而每個時刻的位移為速度的累加,所以代理方法中我們這樣寫
1 -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 2 { 3 _volecity.x += acceleration.x; 4 _volecity.y += acceleration.y; 5 6 self.ball.x += _volecity.x; 7 self.ball.y -= _volecity.y; 8 }
我們設置了一個屬性來記錄速度
1 @property (assign, nonatomic) CGPoint volecity;
運行程序,我們發現小球確實可以做運動,而且具有加速度,但是小球會超出邊界,在代理方法中繼續加入如下代碼
1 if(self.ball.x<=0){ 2 self.ball.x = 0; 3 } 4 if (self.ball.y<=0) { 5 self.ball.y = 0; 6 } 7 if (self.ball.maxX>=self.view.width) { 8 self.ball.maxX = self.view.width; 9 } 10 if (self.ball.maxY>=self.view.height) { 11 self.ball.maxY = self.view.height; 12 }
小球被囚禁在框框中了,我們再添加一些代碼,讓小球碰到邊界時可以反彈
1 //邊界檢測 2 if(self.ball.x<=0){ 3 self.ball.x = 0; 4 //加入反彈,削弱速度 5 _volecity.x *= -0.5; 6 } 7 if (self.ball.y<=0) { 8 self.ball.y = 0; 9 _volecity.y *= -0.5; 10 } 11 if (self.ball.maxX>=self.view.width) { 12 self.ball.maxX = self.view.width; 13 _volecity.x *= -0.5; 14 } 15 if (self.ball.maxY>=self.view.height) { 16 self.ball.maxY = self.view.height; 17 _volecity.y *= -0.5; 18 }
運行程序我們發現小球可以反彈了,效果還不錯,示例代碼:https://github.com/dongbobo1992/iOSExamples