手机传感器

2016-06-12  本文已影响79人  lee_moons

距离传感器

- (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;
        
    }];

上一篇下一篇

猜你喜欢

热点阅读