title: iOS中的感应器
type: categories
date: 2017-01-17 16:54:30
categories: Swift
tags: [CoreMotion,感应器]
iOS中的感应器:
Accelerometer(加速器)
Gyroscope(陀螺仪)
Magnetometer(磁力计)
Proximity(距离感应)
Device motion
CMPedometer(计步器)
https://github.com/zhangzhaopds/CMMotionManager_demo.git
Proximity-距离感应
override func viewDidLoad() {
super.viewDidLoad()
// 开启设备的距离感应(默认是关闭)
UIDevice.current.isProximityMonitoringEnabled = true
// 添加监听
NotificationCenter.default.addObserver(self, selector: #selector(proximityStateChanged), name: NSNotification.Name.UIDeviceProximityStateDidChange, object: nil)
}
// 销毁监听
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIDeviceProximityStateDidChange, object: nil)
}
// 监听回调
func proximityStateChanged() {
switch UIDevice.current.proximityState {
case true:
print("物体靠近")
default:
print("物体远离")
}
}
CoreMotion-加速器、陀螺仪、磁力计
// 导入CoreMotion框架
import CoreMotion
let motionManager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
// 判断加速器是否可用
if !motionManager.isAccelerometerAvailable {
print("加速器不可用")
return
}
// 采样间隔
motionManager.accelerometerUpdateInterval = 0.3
// 加速器采样
motionManager.startAccelerometerUpdates(to: OperationQueue.main) { (accelerometerData, error) in
if (error != nil) {
print("加速器采样错误:\(error)")
return
}
print("加速器采样数据:\(accelerometerData)")
}
// 螺旋仪
if !motionManager.isGyroAvailable {
print("螺旋仪不可用")
return
}
motionManager.gyroUpdateInterval = 0.3
motionManager.startGyroUpdates(to: OperationQueue.main) { (gyroData, error) in
if (error != nil) {
print("螺旋仪采样错误:\(error)")
return
}
print("螺旋仪数据:\(gyroData)")
}
// 磁力计
if !motionManager.isMagnetometerAvailable {
print("磁力计不可用")
return
}
motionManager.magnetometerUpdateInterval = 0.3
motionManager.startMagnetometerUpdates(to: OperationQueue.main) { (magData, error) in
if error != nil {
print("磁力计采样错误:\(error)")
return
}
print("磁力计数据:\(magData)")
}
}
摇一摇
override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
super.motionBegan(motion, with: event)
print("开始摇一摇")
}
override func motionCancelled(_ motion: UIEventSubtype, with event: UIEvent?) {
super.motionCancelled(motion, with: event)
print("取消")
}
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
super.motionEnded(motion, with: event)
print("结束摇一摇")
}
CMPedometer
需先加入 Privacy - Motion Usage Description
权限
if !CMPedometer.isStepCountingAvailable() {
print("计步器不可用")
return
}
let pedometer = CMPedometer()
pedometer.startUpdates(from: Date()) { (data, error) in
if error != nil {
print(error!)
return
}
print(data?.numberOfSteps ?? 0)
}