19.CoreMotion(陀螺仪)

CoreMotion

CoreMotion可以监听x,y,z上个方向的加速度, 它的使用还是蛮简单的, 下面我们学习如何使用它

1. 使用CoreMotion控制小球

import UIKit
import CoreMotion

class ViewController: UIViewController, UIAccelerometerDelegate {

    let motionManager = CMMotionManager()
    // 速度
    var starSpeedX: UIAccelerationValue = 0.0
    var starSpeedY: UIAccelerationValue = 0.0

    var star: UIImageView!


    // 使用加速度传感器控制图片的移动

    override func viewDidLoad() {
        super.viewDidLoad()

        star = UIImageView(image: UIImage(named: "thumbHighlighted"))
        star.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        star.center = self.view.center
        self.view.addSubview(star)

        // startAccelerometerUpdatesToQueue的handler的运行间隔
        motionManager.accelerometerUpdateInterval = 1.0 / 60.0

        if motionManager.accelerometerAvailable {
            let queue = NSOperationQueue.currentQueue()
            motionManager.startAccelerometerUpdatesToQueue(queue!, withHandler: { (cMAccelerometerData, error) -> Void in

                self.starSpeedX += cMAccelerometerData!.acceleration.x
                self.starSpeedY += cMAccelerometerData!.acceleration.y

                let posX = Double(self.star.center.x) + self.starSpeedX
                let posY = Double(self.star.center.y) + self.starSpeedY

                self.star.center = CGPoint(x: posX, y: posY)

            })
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

运行程序, 模拟器貌似没法测试, 使用真机测试即可

从上面的代码可以看出, CoreMotion的使用还是很简单的:

首先初始化一个CMMotionManager()
然后设置时间间隔accelerometerUpdateInterval
最后使用startAccelerometerUpdatesToQueue:withHandler:开启监听

2. startAccelerometerUpdatesToQueue:withHandler:详解

我们查看它的定义:

public func startAccelerometerUpdatesToQueue(queue: NSOperationQueue, withHandler handler: CMAccelerometerHandler)
第一个参数: 是一个NSOperationQueue, 多线程中会介绍, 这里先忽略
第二个参数: 是一个CMAccelerometerHandler

我们查看CMAccelerometerHandler的定义:

public typealias CMAccelerometerHandler = (CMAccelerometerData?, NSError?) -> Void
它就是一个block的别名, 它有两个参数, CMAccelerometerData?和NSError?

我们具体看一下CMAccelerometerData的定义:

@available(iOS 4.0, *)
public class CMAccelerometerData : CMLogItem {
    // 陀螺仪检测出的加速度
    public var acceleration: CMAcceleration { get }
}

我们发现它只有一个只读成员acceleration,他是CMAcceleration类型的, 我们进一步看看CMAcceleration的定义:

public struct CMAcceleration {
    public var x: Double
    public var y: Double
    public var z: Double
    public init()
    public init(x: Double, y: Double, z: Double)
}

它是一个结构体, 包含x,y,z三个方向的加速度

现在非常明了了, 我们在startAccelerometerUpdatesToQueue:withHandler:的CMAccelerometerHandler中就可以获得x,y,z的加速度

停止使用,我们可以使用CMMotionManager的:

 public func stopAccelerometerUpdates()

除此之外, CoreMotion还可以获得旋转和重力加速度

全部代码

import UIKit
import CoreMotion

class ViewController: UIViewController, UIAccelerometerDelegate {

    let motionManager = CMMotionManager()
    // 速度
    var starSpeedX: UIAccelerationValue = 0.0
    var starSpeedY: UIAccelerationValue = 0.0

    var star: UIImageView!


    // 使用加速度传感器控制图片的移动

    override func viewDidLoad() {
        super.viewDidLoad()

        star = UIImageView(image: UIImage(named: "thumbHighlighted"))
        star.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        star.center = self.view.center
        self.view.addSubview(star)

        // startAccelerometerUpdatesToQueue的handler的运行间隔
        motionManager.accelerometerUpdateInterval = 1.0 / 60.0

        if motionManager.accelerometerAvailable {
            let queue = NSOperationQueue.currentQueue()
            motionManager.startAccelerometerUpdatesToQueue(queue!, withHandler: { (cMAccelerometerData, error) -> Void in

                self.starSpeedX += cMAccelerometerData!.acceleration.x
                self.starSpeedY += cMAccelerometerData!.acceleration.y

                let posX = Double(self.star.center.x) + self.starSpeedX
                let posY = Double(self.star.center.y) + self.starSpeedY

                self.star.center = CGPoint(x: posX, y: posY)

            })
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值