iOS开发学习之路【高级主题】——传感器编程
简介
iOS SDK 中提供了四种设备传感器:
- 加速度传感器
Accelerometer
- 陀螺仪
Gyroscope
- 磁力传感器
Magnetometer
- 设备移动传感器
Device motion
传感器编程的API框架是 CoreMotion.framework
,使用时必须添加该框架。
传感器编程的核心类是 CMMotionManager
,可以调用startXXX和stopXXX方法对不同传感器开始更新和停止更新。
检测传感器是否可用
CMMotionManager *manager = [[CMMotionManager alloc]init];
BOOL flog = manager.accelerometerAvailable;
NSLog(@"%@",flog?@"加速度传感器可以使用":@"加速度传感器无法使用");
flog = manager.gyroAvailable;
NSLog(@"%@",flog?@"陀螺仪可以使用":@"陀螺仪无法使用");
flog = manager.deviceMotionAvailable;
NSLog(@"%@",flog?@"设备移动传感器可以使用":@"设备移动传感器无法使用");
flog = manager.magnetometerAvailable;
NSLog(@"%@",flog?@"磁力传感器可以使用":@"磁力传感器无法使用");
加速度传感器
加速度传感器是根据x、y和z三个方向来检测在设备位置的改变。
加速计以相对于自由落体的方式度量加速度。
@interface ViewController ()
// 实例化CMMotionManager
@property(nonatomic, strong)CMMotionManager *manager;
@end
- (IBAction)start:(UIButton *)sender {
// 1.加速度传感器
// 调用startAccelerometerUpdatesToQueue方法,从accelerometerData中获取数据
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[self.manager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
CMAcceleration a = accelerometerData.acceleration;
NSLog(@"[%f,%f,%f]",a.x, a.y, a.z);
}];
}
- (IBAction)stop:(UIButton *)sender {
// 1.加速度传感器
// 调用stopAccelerometerUpdates方法停止
[self.manager stopAccelerometerUpdates];
}
陀螺仪
陀螺仪将报告设备绕x、y、z轴的旋转速度,单位为弧度每秒;
2弧度等于1圈,所以陀螺仪返回读数2.0表示设备绕相应的轴每秒旋转一圈。
加速度传感器和陀螺仪传感器的区别
仅当设备的朝向相对于重力的方向发生变化时,加速计才能检测的到;而无论设备处于什么朝向,只要它在旋转,陀螺仪都能检测的到。
// 2.陀螺仪传感器
[self.manager startGyroUpdatesToQueue:queue withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
CMRotationRate r = gyroData.rotationRate;
NSLog(@"[%f,%f,%f]",r.x, r.y, r.z);
}];
// 2.陀螺仪传感器
[self.manager stopGyroUpdates];
磁力传感器
// 3.磁力传感器
[self.manager startMagnetometerUpdatesToQueue:queue withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
CMMagneticField m = magnetometerData.magneticField;
NSLog(@"[%f,%f,%f]",m.x, m.y, m.z);
}];
// 3.磁力传感器
[self.manager stopMagnetometerUpdates];
设备移动传感器
DeviceMotion
【demo】通过加速传感器控制图片移动
- 添加一张图片,调整到适当大小
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[self.manager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
// 多线程,防止卡顿
dispatch_sync(dispatch_get_main_queue(), ^{
// 获取当前图片的frame属性
CGRect myframe = self.myImage.frame;
// 将当前传感器x值赋值给图片的x
myframe.origin.x += accelerometerData.acceleration.x*20;
// 判断图片x是否越界
if(!CGRectContainsRect(self.view.bounds, myframe)){
myframe.origin.x = self.myImage.frame.origin.x;
}
// 将当前传感器y值赋值给图片的y
myframe.origin.y -= accelerometerData.acceleration.y*20;
// 判断图片y是否越界
if(!CGRectContainsRect(self.view.bounds, myframe)){
myframe.origin.y = self.myImage.frame.origin.y;
}
// 更新frame属性
self.myImage.frame = myframe;
});
}];
}