1.加速傳感器能夠監聽到x,y,z三個方向的加速度,步驟以下:
(1)實例化CMMotionManager類
(2)向CMMotionManager的accelerometerUpdateInterval屬性中設置通知間隔時間值
(3)使用PerationQueeu.current創建一個監聽隊列
(4)使用startAccelerometerUpfates方法更新監聽隊列,並設置回調函數用於接受加速度通知。在回調函數中使用accelerometerData.acceleration相關屬性能夠獲取x,y,z各個方向的加速度swift
2.通知頻率設置建議
accelerometerUpdateInterval表示通知頻率,表示間隔多少bn秒通知一次。iPhone開發檔案中推薦使用的通知間隔以下:
(1)檢測設備朝向:1/10 ~ 1/20
(2)在遊戲中須要實時使用加速傳感器時:1/30 ~ 1/60
(3)檢測敲擊設備或劇烈搖動設備的狀況下:1/70 ~ 1/100ide
3.x,y,z軸
(1)對於iPhone手機來講,畫面上下爲y軸,左右爲x軸,k貫穿屏幕爲z軸
(2)向上,向右,手機的前面分別是各軸的正方向函數
4.加速度(原始加速度)
加速度不只受震動手機時施加的做用力的印象,還會持續受到重力的影響,所以iPhone手機若是垂直拿在手上的話,y軸負方向將受到重力做用,加速度y屬性將一直爲負值(最小值爲-1.0)測試
5.Gravity和UserAcceleration
motionManager.deviceMotion.userAcceleration.x和motionManager.accelerometerData!.acceleration.x兩個獲取的acceleration的區別:上面提到的原始的加速度(即經過startAccelerometerUpdates獲取的那個值)其實是由兩種加速度合成而來的,一個是重力加速度(Gravity),一個是用戶對手機是假的加速度(UserAcceleration)(固然咱們也能夠分別獲取這兩種加速度)。因此當手機垂直靜止時,雖然UserAcceleration是0,但因爲有重力加速度,因此兩個合成後加速度y屬性即是負值code
6.測試樣式
該應用運行後,將在畫面中央顯示一個球體,傾斜手機時,球體將向着親些的方向運動,碰撞到四壁後反彈回來
*/隊列
import UIKit import CoreMotion class ViewController: UIViewController{ var ball:UIImageView! var speedX:UIAccelerationValue = 0 var speedY:UIAccelerationValue = 0 var motionManager = CMMotionManager() override func viewDidLoad() { super.viewDidLoad() //放一個球在中央 ball = UIImageView(image: UIImage(named: "Ball")) ball.frame = CGRect(x: 0, y: 0, width: 50, height: 50) ball.center = self.view.center self.view.addSubview(ball) motionManager.accelerometerUpdateInterval = 1/60 if motionManager.isAccelerometerAvailable{ let queue = OperationQueue.current motionManager.startAccelerometerUpdates(to: queue!) { (accelerometerData, error) in if error != nil{ self.motionManager.stopAccelerometerUpdates() }else{ //動態設置小球位置 self.speedX += accelerometerData!.acceleration.x self.speedY += accelerometerData!.acceleration.y var posX = self.ball.center.x + CGFloat(self.speedX) var posY = self.ball.center.y + CGFloat(self.speedY) //碰到邊框後的反彈處理 if posX<0{ posX = 0 //碰到左邊的邊框以0.4倍的速度反彈 self.speedX *= -0.4 }else if posX > self.view.bounds.size.width{ posX = self.view.bounds.size.width //碰到右邊的邊框以0.4倍的速度反彈 self.speedX *= -0.4 } if posY < 0{ posY = 0 //碰到上面的邊框不反彈 self.speedY = 0 }else if posY > self.view.bounds.size.height{ posY = self.view.bounds.size.height //碰到下面的邊框以1.5倍的速度反彈 self.speedY *= -1.5 } self.ball.center = CGPoint(x: posX, y: posY) } } }else{ print("你的設備不支持加速計") } } }