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来实现上篇博文的小球程序。