iOS传感器(CoreMotion)

作者: 蚂蚁牙齿不黑 | 来源:发表于2016-05-03 16:20 被阅读482次

    介绍几种iOS中常用的传感器,需用真机测试

    一 距离传感器

    作用:检测是否有物品靠近
    应用场景: 打电话时如果贴近耳朵屏幕会自动变暗 微信听别人说的语音时,把手机靠近耳朵屏幕也会自动变暗
    代码实现:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 打开距离传感器
        [UIDevice currentDevice].proximityMonitoringEnabled = YES;
        
        // 监听有物品靠近还是离开
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
    }
    
    - (void)proximityStateDidChange
    {
        if ([UIDevice currentDevice].proximityState) {
            NSLog(@"有物品靠近  屏幕变暗");
        } else {
            NSLog(@"有物品离开  屏幕变亮");
        }
    }
    

    二 加速计

    作用:检测设备的运动
    应用场景:摇一摇 计步器
    加速计原理:根据(X,Y,Z)轴加速度的值判断哪个方向运动或有力的作用
    代码实现 需导入CoreMotion框架
    两种方式

    • pull方式:需要时获取加速计的值
    • push方式:实时更新加速计的值
    pull 方式
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 1.判断加速计是否可用
        if (!self.mgr.isAccelerometerAvailable) {
            NSLog(@"加速计坏了,请更换手机");
            return;
        }
        
        // 2.开始采样
        [self.mgr startAccelerometerUpdates];
    }
        //  3.点击屏幕开始获取加速计的值
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
        NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
    }
    
          push方式
    
        // 1.创建运动管理者
         CMMotionManager *mgr = [[CMMotionManager alloc] init];
        
        // 2.判断加速计是否可用
        if (!mgr.isAccelerometerAvailable) {
            NSLog(@"加速计不可用");
            return;
        }
        
        // 3.设置采样间隔
        self.mgr.accelerometerUpdateInterval = 1.0;
        
        // 4.开始采样
        [self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            // 1.判断获取的过程中是否有错误
            if (error) {
                NSLog(@"%@", error);
                return;
            }
            
            // 2.获取加速计的数值
            CMAcceleration acceleration = accelerometerData.acceleration;
            NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
        }];
    

    三 陀螺仪

    作用:检测设备的旋转
    应用场景:赛车游戏中方向的控制
    代码实现:需导入CoreMotion框架
    相比于加速计 同样有两种方式(push pull)获取陀螺仪信息

    懒加载

    - (CMMotionManager *)mgr
    {
        if (_mgr == nil) {
            _mgr = [[CMMotionManager alloc] init];
        }
        return _mgr;
    }
    
    • push 方式
        // 1.判断陀螺仪是否可用
        if (!self.mgr.isGyroAvailable) {
            NSLog(@"陀螺仪不可用,请更换手机");
            return;
        }
        
        // 2.设置采样间隔
        self.mgr.gyroUpdateInterval = 1.0 / 3;
        
        // 3.开始采样
        [self.mgr startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@", error);
                return;
            }
            
            // 获取陀螺仪的数值
            CMRotationRate rate = gyroData.rotationRate;
            NSLog(@"x:%f y:%f z:%f", rate.x, rate.y ,rate.z);
        }];
    
    
    • pull方式
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // pull方式
        // 1.判断陀螺仪是否可用
        if (!self.mgr.isGyroAvailable) {
            NSLog(@"陀螺仪不可用,请更换手机");
            return;
        }
        // 2.开始采样
        [self.mgr startGyroUpdates];
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        CMRotationRate rate = self.mgr.gyroData.rotationRate;
        NSLog(@"x:%f y:%f z:%f", rate.x, rate.y ,rate.z);
    }
    

    三 摇一摇

    作用:检测用户是否摇晃了手机

    代码实现三个方法即可

    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
    {
        NSLog(@"开始摇一摇");
    }
    
    -(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
        NSLog(@"摇一摇取消");
    
    }
    
    -(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    
        NSLog(@"摇一摇结束");
    }
    

    四 计步器

    作用:检测用户走了多少步
    原理:检测设备加速度
    苹果提供了两套api iOS7及iOS8的api 用法基本相同

    • iOS7用法
        // 1.判断计步器是否可用
        if (![CMStepCounter isStepCountingAvailable]) {
            NSLog(@"计步器不可用");
            return;
        }
        
        // 2.创建计步器对象
        CMStepCounter *stepCounter = [[CMStepCounter alloc] init];
        
        // 3.开始计步
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        [stepCounter startStepCountingUpdatesToQueue:queue updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@", error);
                return;
            }
            
            dispatch_async(dispatch_get_main_queue(), ^{
                self.stepLabel.text = [NSString stringWithFormat:@"您一共了%ld步", numberOfSteps];
            });
        }];
    
    • iOS8用法
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 1.判断计步器是否可用
        if (![CMPedometer isStepCountingAvailable]) {
            NSLog(@"计步器不可用");
            return;
        }
        // 2.创建计步器对象
         CMPedometer *pedometer = [[CMPedometer alloc] init];
        
        // 3.开始计步
        
        [pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@", error);
                return;
            }
            
            NSLog(@"%@", pedometerData.numberOfSteps);
        }];
         
        
        // 4.查询之前走了多少步
        NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
        fmt.dateFormat = @"yyyy-MM-dd";
        NSDate *fromDate = [fmt dateFromString:@"2015-10-22"];
        NSDate *toDate = [fmt dateFromString:@"2015-10-29"];
        [pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
           
            if (error) {
                NSLog(@"%@", error);
                return;
            }
            
            NSLog(@"%@", pedometerData.numberOfSteps);
        }];
    }
    
    

    相关文章

      网友评论

        本文标题:iOS传感器(CoreMotion)

        本文链接:https://www.haomeiwen.com/subject/bxtrrttx.html