iOS_传感器的使用

一、距离传感器

大概解释一下距离传感器的功能:它会根据你和iphone间距离不同做出不同的响应。

  1. //打开距离传感器  
  2. [UIDevice currentDevice].proximityMonitoringEnabled = YES;  
  3. //监听距离传感器状态变化通知  
  4. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sensorStateChange:)name:UIDeviceProximityStateDidChangeNotification object:nil];  
  5. //传感器距离状态变化后调用的方法  
  6. -(void)sensorStateChange:(NSNotificationCenter *)notification;  
  7. {  
  8.     if ([[UIDevice currentDevice] proximityState] == YES) {  
  9.         NSLog(@"屏幕黑屏");  
  10.         //在此写接近时,要做的操作逻辑代码  
  11.   
  12.     }else{  
  13.         NSLog(@"屏幕打开");  
  14.     }  
  15. }  

运行,将手靠近感应器与离开时的结果:

二、加速计(UIAccelerometer/CoreMotion),也称为重力感应。

UIAccelerometer虽然已经停止更新,但是目前还是有一定数量的应用中使用到了该技术。

下面也就再继续使用UIAccelerometer进行编写了:

  1. @interface ViewController ()<UIAccelerometerDelegate>  
  2. @property (strong, nonatomic) UILabel *graView;  
  3. @property (assign, nonatomic) UIAccelerationValue speedX;  
  4. @property (assign, nonatomic) UIAccelerationValue speedY;  
  5. @end     
  6.    
  7. //创建并设置接收加速度通知的时间间隔:1.0/60.0 表示一秒接收60次。次数越多,灵敏度越高。  
  8.   UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];  
  9.   accelerometer.updateInterval = 1.0/60.0;  
  10. //添加代理,开启加速度传感器。若代理设置为空,关闭加速传感器(不用的时候记得关闭)  
  11.   accelerometer.delegate = self;  
  12. //创建小滑块  
  13.   _graView = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];  
  14.   _graView.center = self.view.center;  
  15.   _graView.backgroundColor = [UIColor orangeColor];  
  16.   _graView.text = @"滑块";  
  17.   _graView.textAlignment = NSTextAlignmentCenter;  
  18.   [self.view addSubview:_graView];  
  19.   
  20. //代理方法  
  21. - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration  
  22. {  
  23.     //x、y轴方向的速度加上对应轴方向获得的加速度  
  24.     _speedX += acceleration.x;  
  25.     _speedY += acceleration.y;  
  26.       
  27.     /**  
  28.      *  小方块将要移动到的xy轴坐标.  
  29.      *  若posX 0.0 的时候,posX != 0.0,允许反弹,小方块会一直弹跳  
  30.      *  若posX 10.0时,posX = 10.0,关闭反弹,小方块不会沿着反方向滑动,除非达到一定的加速度  
  31.      */  
  32.     CGFloat posX = _graView.center.x + _speedX;  
  33.     CGFloat posY = _graView.center.y - _speedY;  
  34.     //碰撞检测  
  35.     if (posX 0.0) {  
  36.         posX = 0.0;  
  37.         //碰到屏幕左边以0.4倍的速度反弹  
  38.         _speedX *= -0.4;  
  39.     }else if(posX > self.view.bounds.size.width){  
  40.         posX = self.view.bounds.size.width;  
  41.         //碰到屏幕右边以0.4倍的速度反弹  
  42.         _speedX *= -0.4;  
  43.     }  
  44.     if (posY 0.0) {  
  45.         posY = 0.0;  
  46.         //碰到屏幕上边不反弹  
  47.         _speedY = 0.0;  
  48.     }else if (posY > self.view.bounds.size.height){  
  49.         posY = self.view.bounds.size.height;  
  50.         //碰到屏幕下边以0.8倍的速度反弹  
  51.         _speedY *= -0.8;  
  52.     }  
  53.     //移动小方块  
  54.     _graView.center = CGPointMake(posX, posY);  
  55. }  

附上模拟器运行截图,不能动的,具体效果见真机吧。亲测可用,灵敏度调高就有点类似摇一摇,但也因为移动定位太快很快就会贴边,不会有逐渐放慢的效果。

三、三轴陀螺仪

声明一个CMMotionManager属性,可用来获取三轴坐标与加速计。

 

  1. @property (strong, nonatomic) CMMotionManager *motionManager;  

创建相关对象

 

  1. self.motionManager = [[CMMotionManager alloc] init];  
  1. NSOperationQueue *queue = [[NSOperationQueue alloc] init];  

Ps:我自己又多创建了一个label(_gyroscopeLabel 属性)用来接收相关信息,大家自己创建吧,不列代码了。

用自己创建的label接收三轴坐标信息:

 

  1. //陀螺仪  
  2. if (motionManager.gyroAvailable) {  
  3.     motionManager.gyroUpdateInterval = 1.0/10.0;//更新频率  
  4.     //后台线程 开始更新  
  5.     [motionManager startGyroUpdatesToQueue:queue withHandler:^(CMGyroData *gyroData,NSError *error){  
  6.         NSString *labelText;  
  7.         if (error) {  
  8.             [motionManager stopGyroUpdates];  
  9.             labelText = [NSString stringWithFormat:@"错误: %@",error];  
  10.         }else{  
  11.             labelText = [NSString stringWithFormat:@"陀螺仪-> x:%.2f y:%.2f z:%.2f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData.rotationRate.z];  
  12.         }  
  13.         [_gyroscopeLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];  
  14.     }];    
  15. }else{    
  16.     _gyroscopeLabel.text = @"这个设备没有陀螺仪";  
  17. }  

刚才说过,也可用来获取加速计(重力感应)

Ps:_accelerometerLabel也是自己另外创建的label,用来接收加速计信息。大家自己另外创建即可。

  1. //加速计。这也算是重力感应的另一种实现方法  
  2. if (motionManager.accelerometerAvailable) {  
  3.     motionManager.accelerometerUpdateInterval = 1.0/10.0;//更新频率  
  4.     //后台线程 开始更新  
  5.     [motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData,NSError *error){  
  6.         NSString *labelText;  
  7.         if (error) {  
  8.             [motionManager stopAccelerometerUpdates];  
  9.             labelText = [NSString stringWithFormat:@"错误: %@",error];  
  10.         }else{  
  11.             labelText = [NSString stringWithFormat:@"加速计-> x:%.2f y:%.2f z:%.2f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z];  
  12.         }  
  13.         [_accelerometerLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];  
  14.     }];  
  15. }else{  
  16.     _accelerometerLabel.text = @"这个设备没有加速计";  
  17. }  

虚拟器运行结果:

真机测试结果:

 

四、磁力传感器

磁力计的数据也是基于CMMotionManager获取到得。关于CMMotionManager的创建跟三轴陀螺仪一样:

Ps:_directionLabel自己创建的label。

  1. CMMotionManager *motionManager = [[CMMotionManager alloc] init];  
  1. NSOperationQueue *queue = [[NSOperationQueue alloc] init];  
  2. if (motionManager.magnetometerAvailable) {  
  3.     motionManager.magnetometerUpdateInterval = 1/10.0;//更新频率  
  4.     //后台线程 开始更新  
  5.     [motionManager startMagnetometerUpdatesToQueue:queue withHandler:^(CMMagnetometerData *magnetometerData, NSError *error) {  
  6.         NSString *labelText;  
  7.         if (error) {  
  8.             [motionManager stopMagnetometerUpdates];  
  9.             labelText = [NSString stringWithFormat:@"错误: %@",error];  
  10.         }else{  
  11.             labelText = [NSString stringWithFormat:@"磁力计-> x:%.2f y:%.2f z:%.2f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z];  
  12.         }  
  13.         [_directionLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];  
  14.     }];  
  15. }else{  
  16.     NSLog(@"设备没有磁力计");  
  17. }  
原文地址:https://www.cnblogs.com/-ios/p/6237665.html