加速传感器以前用的UIAccelerometer实现,但是Xcode6后完全放弃了,使用CoreMotion代替它能监听到x,y,z三个方向的加速度,听起来比较炫,实际上使用方法很简单,具体使用步骤如下:
1、实例化CMMotionManager类
2、向CMMotionManager的accelerometerUpdateInterval属性中设置通知间隔时间值。
3、使用NSOperationQueue.currentQueue()建立一个监听队列
4、使用startAccelerometerUpdatesToQueue 方法更新监听队列,并设置回调函数用于接受加速度通知,通知时间间隔已经在第二步设置过。在回调函数中使用accelerometerData.acceleration 相关属性可以获得x,y,z各方向的加速度。
import UIKit
import CoreMotion
class ViewController: UIViewController{
var ball:UIImageView!
// 设备x轴的加速值
var spendX:UIAccelerationValue = 0
// 设备x轴的加速值
var spendY:UIAccelerationValue = 0
var motionManager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
ball = UIImageView.init(image: UIImage(named:"1"))
ball.frame = CGRect.init(x: 0, y: 0, width: 50, height: 50)
ball.center = self.view.center
self.view.addSubview(ball)
// 告诉motionManager更新的频率
motionManager.accelerometerUpdateInterval = 1/60
//判断加速器是否可用
if motionManager.isAccelerometerAvailable {
let queue = OperationQueue.current
// 开始更新,后台线程运行
motionManager.startAccelerometerUpdates(to: queue!, withHandler: {
(CMAccelerometerData,NSError) in
//动态设置小球位置
self.spendX += (CMAccelerometerData?.acceleration.x)!
self.spendY += (CMAccelerometerData?.acceleration.y)!
var posX = (self.ball.center.x) + CGFloat((self.spendX))
var posY = (self.ball.center.y) - CGFloat((self.spendY))
//碰到边框后的反弹处理
if posX < 0{
posX = 0
//碰到左边的边框后以0.4倍的速度反弹
self.spendX *= -0.4
} else if posX > (self.view.frame.size.width) {
posX = (self.view.frame.size.width)
//碰到右边的边框有以0.4倍的速度反弹
self.spendX *= -0.4
}
if posY < 0{
posY = 0
//碰到上面的边框不反弹
self.spendY = 0
} else if posY > (self.view.bounds.size.height){
posY = (self.view.frame.size.height)
//碰到下面的边框以1.5倍的速度反弹
self.spendY *= -1.5
}
self.ball.center = CGPoint.init(x: posX, y: posY)
})
}
}
}