美文网首页
手机传感器

手机传感器

作者: lee_moons | 来源:发表于2016-06-12 16:40 被阅读79次

    距离传感器

    - (void)viewDidLoad {
        [super viewDidLoad];
        // 打开距离传感器  默认是关闭的
        [UIDevice currentDevice].proximityMonitoringEnabled = YES;
        // 判断距离传感器是否打开
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChangeNotification) name:UIDeviceProximityStateDidChangeNotification object:nil];
    }
    // 当距离传感器状态改变时调用
    - (void)proximityStateDidChangeNotification
    {
        if ([UIDevice currentDevice].proximityState == YES) {
            NSLog(@"靠近了");
        }else{
            NSLog(@"离开了");
        }
    }
    

    CoreMotion

    导入CoreMotion框架
    1.加速计 A
    2.磁力计 M
    3.陀螺仪 G

    #import <CoreMotion/CoreMotion.h>
    @interface ViewController ()
    // 管理者
    @property (nonatomic, strong) CMMotionManager *motionManager;
    @end
    

    创建管理者

    self.motionManager = [[CMMotionManager alloc] init];
    // 判断硬件是否可用
    //     1.加速计 A
    if (self.motionManager.accelerometerAvailable == NO) {
            NSLog(@"加速计不可用");
        }
        // 在使用时才获取数据
        // 开始采集加速计数据
        [self.motionManager startAccelerometerUpdates];
        [self accelerometerPush];
        
    //     2.磁力计 M
    if (self.motionManager.magnetometerData == NO) {
            NSLog(@"磁力计不可用");
        }
        [self.motionManager startMagnetometerUpdates];
        [self gyroPush];
        
    //     3.陀螺仪 G
    if (self.motionManager.gyroAvailable == NO) {
            NSLog(@"陀螺仪不可用");
        }
        [self.motionManager startGyroUpdates];
        [self magnetometerPush];
    
    

    加速器push方法

    - (void)accelerometerPush
    {
        // 一直推送数据
        // 设置采集数据的频率
        self.motionManager.accelerometerUpdateInterval = 1;
        // 采集数据
        [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            // 打印错误
            if (error) {
                NSLog(@"%@",error);
            }
            //    1:受到了一个重力的作用
            NSLog(@"x:   %f     y  : %f     z :  %f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
        }];
    }
    

    磁力计push方法

    - (void)magnetometerPush
    {
        // 设置更新频率
        self.motionManager.gyroUpdateInterval = 1;
        // push方式
        [self.motionManager startMagnetometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
            }
            
            // 单位:特斯拉
            NSLog(@"x  : %f   y : %f  z  : %f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z);
            
        }];
    }
    

    陀螺仪push方法

    - (void)gyroPush
    {
        // 设置更新频率
        self.motionManager.gyroUpdateInterval = 1;
        // 开始采集数据
        [self.motionManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
            }
            NSLog(@"x  : %f   y : %f  z  : %f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData.rotationRate.z);
        }];
    }
    

    计步器

    导入CoreMotion框架
    导入头文件,设置属性
    设置iOS8之前的计步器

    #import <CoreMotion/CoreMotion.h>
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UILabel *stepLabel;
    @property (nonatomic, strong) CMStepCounter *stepCounter;
    @end
    
     // 判断计步器是否可用
        if (![CMStepCounter isStepCountingAvailable]) {
            NSLog(@"计步器不可用");
        }
        // 创建计步器对象
        self.stepCounter = [[CMStepCounter alloc] init];
        // 开始计步
        // updateOn:从几步开始显示数据
        [self.stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
            }
            self.stepLabel.text = [NSString stringWithFormat:@"%zd",numberOfSteps];
        }];
    
    

    iOS8之后的计步器

    #import <CoreMotion/CoreMotion.h>
    @interface ViewController ()
    @property (nonatomic, strong) CMPedometer *pedometer;
    @end
    
    // 1.判断计步器是否可用
        if (![CMPedometer isStepCountingAvailable]) {
            NSLog(@"计步器不可用");
        }
        // 2.创建计步器对象
        self.pedometer = [[CMPedometer alloc] init];
        // 3.开始计步
        // FromDate 从哪个时间开始计步
        [self.pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
            }
            NSLog(@"%@",pedometerData.numberOfSteps);
        }];
    
    

    摇一摇操作

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

    加速器使用之小球运动

    导入头文件 导入框架CoreMotion

    #import <CoreMotion/CoreMotion.h>
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIImageView *ballView;
    @property (nonatomic, strong) CMMotionManager *motionManager;
    // 小球的速度
    @property (nonatomic, assign) CGPoint speed;
    @end
    

    设置小球

    // 创建管理者
        self.motionManager = [[CMMotionManager alloc] init];
        // 判断硬件是否可用
        if (self.motionManager.isAccelerometerAvailable == NO) {
            NSLog(@"加速计不可用");
        }
        // push方式
        // 设置更新频率
        self.motionManager.accelerometerUpdateInterval = 1 / 30.0;
        // 开始采集数据
        [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
            }
            // 加速度 -->速度 -->距离(位置)
            NSLog(@"x  %f    y   %f",accelerometerData.acceleration.x,accelerometerData.acceleration.y);
            
            // 目标:改变小球的位置 -->x和y
            
            // 1.速度
            _speed.x += accelerometerData.acceleration.x;
            _speed.y -= accelerometerData.acceleration.y;
            
            CGRect ballViewFrame = self.ballView.frame;
            // 2.小球要移动的距离
            // 3.改变小球的frame
            ballViewFrame.origin.x += _speed.x;
            ballViewFrame.origin.y += _speed.y;
            // 屏幕左边
            if (ballViewFrame.origin.x < 0) {
                ballViewFrame.origin.x = 0;
                // 让小球弹起来
                // 0.8 :让小球加一个阻力效果
                _speed.x *= -0.8;
            }
            // 屏幕右边
            if (ballViewFrame.origin.x > self.view.bounds.size.width - self.ballView.frame.size.width) {
                ballViewFrame.origin.x = self.view.bounds.size.width - self.ballView.frame.size.width;
                _speed.x *= -0.8;
            }
            // 屏幕上边
            if (ballViewFrame.origin.y < 0) {
                ballViewFrame.origin.y = 0;
                _speed.y *= -0.8;
            }
            // 屏幕下边
            if (ballViewFrame.origin.y > self.view.bounds.size.height - self.ballView.frame.size.height) {
                ballViewFrame.origin.y = self.view.bounds.size.height - self.ballView.frame.size.height;
                _speed.y *= -0.8;
            }
            
            // 4.给小球位置赋值
            self.ballView.frame = ballViewFrame;
            
        }];
    
    

    相关文章

      网友评论

          本文标题:手机传感器

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