您的位置:首页 > 移动开发 > Swift

swift 加速传感器

2017-01-04 19:41 267 查看
加速传感器以前用的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)

 

             })

 

            

            

        }

    }

   

   

    

    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios swift CMMotionManager