• 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. }  
  • 相关阅读:
    RESTful API 架构解读
    在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)
    在阿里云 ECS 搭建 nginx https nodejs 环境(二、https)
    linux 常见操作指令
    前端数据存储方案集合(cookie localStorage等)以及详解 (二)
    无法从其“Checked”属性的字符串表示形式“checked”创建“System.Boolean”类型
    VS2012使用验证控件出现[ASP.NET]WebForms UnobtrusiveValidationMode 需要 'jquery' 的 ScriptResourceMapping。請加入 ScriptResourceMapping 命名的 jquery (區分大小寫)。的解决办法。
    使用SHFB(Sandcastle Help File Builder)建立MSDN风格的代码文档
    常用正则表达式总结
    sql 中有关时间的语句
  • 原文地址:https://www.cnblogs.com/-ios/p/6237665.html
Copyright © 2020-2023  润新知