一:CoreMotion简介
CoreMotion
框架是苹果应对各式各样的传感器推出的一个集合框架,可方便地使用该框架对诸如磁场、加速度、等物理量的测量。其核心组件为CoreMotion
,使用时import该包即可。管理方面使用CMMotionManager
进行综合管理。
二:使用
磁场传感器的使用分为pull和push,前者是实时采集所有数据,后者是调用时才会采取一次。先看pull方式:
说明:这里是通过magneticField拿到x、y、z三个轴的磁感应强度(单位:微特斯拉),而magneticField又是通过magnetometerData拿到的。
import UIKit
import CoreMotion
class ViewController: UIViewController{
var cm: CMMotionManager!;
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var mLabel: UILabel!
@IBOutlet weak var progressX: UIProgressView!
@IBOutlet weak var progressY: UIProgressView!
@IBOutlet weak var progressZ: UIProgressView!
@IBAction func buttonListener(_ sender: Any) {
self.cm.startMagnetometerUpdates()
if let magnetometerData = self.cm.magnetometerData {
let magneticField = magnetometerData.magneticField
var text = "---Current Data of MagneticField---\n"
text += "x: \(magneticField.x)\n"
text += "y: \(magneticField.y)\n"
text += "z: \(magneticField.z)\n"
self.textView.text = text;
print(magneticField.x);
print(magneticField.y);
print(magneticField.z);
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
cm = CMMotionManager();
}
override func viewWillAppear(_ animated: Bool) {
cl.startUpdatingHeading();
}
}
push方式:
说明:这里通过self.motionManager.magnetometerUpdateInterval = self.timeInterval
设置时间刷新间隔,设置一个操作队列,并在其内判断self.cm.isMagnetometerActive
布尔值来判断传感器是否活跃来获取
import UIKit
import CoreMotion
class ViewController: UIViewController{
var cm: CMMotionManager!;
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var mLabel: UILabel!
@IBOutlet weak var progressX: UIProgressView!
@IBOutlet weak var progressY: UIProgressView!
@IBOutlet weak var progressZ: UIProgressView!
let times: TimeInterval = 0.2;
@IBAction func buttonListener(_ sender: Any) {
/*
self.cm.startMagnetometerUpdates()
if let magnetometerData = self.cm.magnetometerData {
let magneticField = magnetometerData.magneticField
var text = "---Current Data of MagneticField---\n"
text += "x: \(magneticField.x)\n"
text += "y: \(magneticField.y)\n"
text += "z: \(magneticField.z)\n"
self.textView.text = text;
print(magneticField.x);
print(magneticField.y);
print(magneticField.z);
}
*/
startMagnetometerUpdates();
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
cm = CMMotionManager();
}
override func viewWillAppear(_ animated: Bool) {
cl.startUpdatingHeading();
}
func startMagnetometerUpdates() {
guard cm.isMagnetometerAvailable else {
self.textView.text = "\nCurrent device is not supported.\n"
return
}
self.cm.magnetometerUpdateInterval = self.times;
let queue = OperationQueue.current
self.cm.startMagnetometerUpdates(to: queue!, withHandler: {
(magnetometerData, error) in
guard error == nil else {
print(error!)
return
}
if self.cm.isMagnetometerActive {
if let magneticField = magnetometerData?.magneticField {
var text = "---Current Data of Magnetic---\n"
text += "x: \(magneticField.x)\n"
text += "y: \(magneticField.y)\n"
text += "z: \(magneticField.z)\n"
self.textView.text = text
self.progressX.progress = Float(-magneticField.x / 10);
self.progressY.progress = Float(magneticField.y / 1000);
self.progressZ.progress = Float(-magneticField.z / 1000);
}
}
})
}
}