iOS 磁场传感器的应用 Swift CoreMotion使用
时间:2022-10-20 01:00:00
一: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);
}
}
})
}
}