iOS开发之加速计(二)CoreMotion

iOS4之前,加速度计由UIAccelerometer类来负责采集数据。随着iPhone4的推出,加速度计全面升级,并引入了陀螺仪Motion(运动)相关的编程成为重头戏,苹果特地在iOS4中增加了专门处理Motion的框架-CoreMotion.framework

Core Motion获取数据的两种方式

  • push 实时采集所有数据(采集频率高)
  • pull 在有需要的时候,再主动去采集数据

我们该在我们的应用程序中使用哪种方式呢,苹果给了我们建议

 

CoreMotion框架图

学以致用

看再多都不如自己亲自敲敲代码

导入CoreMotion

1 import CoreMotion

设置成员变量

1 var mgr:CMMotionManager!

在ViewDidLoad中添加如下代码

1 //创建CMMotionManager对象
2         self.mgr = CMMotionManager()
3         //判断是否可用
4         if(mgr.accelerometerAvailable){
5             //设置采样率
6             mgr.accelerometerUpdateInterval = 1.0/60.0
7             //开始采样
8             mgr.startAccelerometerUpdates()
9         }

重写touchBegan,也可以在适当的时候采集,我们采集加速度数据

1     override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
2         let acc:CMAcceleration = mgr.accelerometerData.acceleration
3         println(acc.x,acc.y,acc.z)
4     }

运行程序点击屏幕,我们看到如下打印

1 (-0.0323944091796875, -0.0291748046875, -0.929931640625)
2 (-0.0157928466796875, -0.0283660888671875, -1.00149536132812)
3 (-0.0167999267578125, -0.031402587890625, -0.99468994140625)

这种方式称为主动拉取pull,比较省电,而且可以在适当的时候停止采样

1 mgr.stopAccelerometerUpdates()

我们再来看看被动Push方式

1     //push方式
2     func push(){
3         self.mgr.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: { (data:CMAccelerometerDat        a!,error:NSError!) -> Void in
4             //更新UI放主队列
5             //耗时操作放其他队列
6             let acc:CMAcceleration = data.acceleration
7             println(acc.x,acc.y,acc.z)
8         })
9     }

这种是通过闭包实时获取数据,所以比较费电。需要注意,如果要更新UI,要放主队列中。如果有耗时操作,放其他队列。有兴趣的读者可以用CoreMotion来实现上篇博文的小球程序。

示例程序:https://github.com/dongbobo1992/iOSExamples

posted @ 2015-02-10 14:35  董文博  阅读(465)  评论(0编辑  收藏  举报