一: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);
                    }
                }
            })
        }


}


Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐