iOS 磁场传感器的应用 Swift CoreMotion使用

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


}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值