传感器

  • 加速计 陀螺仪 磁力计 距离传感器 计步器 摇一摇
  • 传感器是一种感应 检测装置
  • 作用:用于感应 检测设备周边信息
    在地图应用中,能判断出手机头面向的方向
    一关灯,iphone会自动降低亮度,让屏幕显得不是那么刺眼
    打电话时,人脸贴近iPhone屏幕时,屏幕会自动锁屏,达到省电的目的
  • iphone5内置传感器:
    运动传感器 加速度传感器
    环境光传感器 :感应周边环境光线的强弱(自动调节屏幕亮度)
    距离传感器:感应是否有其他物体靠近设备屏幕(打电话自动锁屏)
    磁力计传感器:感应周边的磁场(盒盖锁屏)
    内部温度传感器:感应设备内部的温度(提醒用户降温,防止设备损伤)
    湿度传感器:感应设备是否进水(方便维护人员)
    陀螺仪:感应设备的持握方式(赛车类游戏)
    加速计:感应设备的运动(摇一摇,计步器)
    气压传感器:测量大气压的气压计(测算海拔高度)iphone6新增

摇一摇

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

距离传感器

    //打开距离传感器(默认是关闭)
    [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框架的使用

加速计(Accelerometer)

//导入框架
CoreMotion.framework
//导入头文件
#import 
  • push方式
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
    //1.创建运动管理者
    CMMotionManager *manager = [[CMMotionManager alloc] init];
    self.manager = manager;
    
    //2.判断加速计是否可用
    if(self.manager.isAccelerometerAvailable == NO){
        NSLog(@"加速计不可用");
    }
    
    //3.获取加速计数据
    
    //push方式
    //设置数据的更新频率
    self.manager.accelerometerUpdateInterval = 1.0;
    //获取数据
    [self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
        if(error){
            NSLog(@"%@",error);
        }
        //1表示一个重力加速度 g
        NSLog(@"x:%f y:%f z:%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
    }];
  • pull方式
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//------------------------------------------------------------
//1.创建运动管理者
    CMMotionManager *manager = [[CMMotionManager alloc] init];
    self.manager = manager;
    
    //2.判断加速计是否可用
    if(self.manager.isAccelerometerAvailable == NO){
        NSLog(@"加速计不可用");
    }
    
    //3.开始获取加速计更新数据
    [self.manager startAccelerometerUpdates];
//pull方式
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"x:%f y:%f z:%f",self.manager.accelerometerData.acceleration.x,self.manager.accelerometerData.acceleration.y,self.manager.accelerometerData.acceleration.z);
}

磁力计(Magnetometer)

//导入框架
CoreMotion.framework
//导入头文件
#import 
  • push方式
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
    //1.创建运动管理者
    CMMotionManager *manager = [[CMMotionManager alloc] init];
    self.manager = manager;
    
    //2.判断磁力计是否可用
    if(self.manager.isMagnetometerAvailable == NO){
        NSLog(@"磁力计不可用");
    }
    
    //3.获取磁力计数据
    //push方式
    //设置数据更新频率
    self.manager.magnetometerUpdateInterval = 1.0;
    [self.manager startMagnetometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
        if(error){
            NSLog(@"%@",error);
        }
        //磁力计的单位:T 特斯拉
        NSLog(@"x:%f y:%f z:%f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z);
    }];
  • pull方式
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
    //1.创建运动管理者
    CMMotionManager *manager = [[CMMotionManager alloc] init];
    self.manager = manager;
    
    //2.判断磁力计是否可用
    if(self.manager.isMagnetometerAvailable == NO){
        NSLog(@"磁力计不可用");
    }
    
    //3.获取磁力计数据
  
   [self.manager startMagnetometerUpdates];
//pull方式
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"x:%f y:%f z:%f",self.manager.magnetometerData.magneticField.x,self.manager.magnetometerData.magneticField.y,self.manager.magnetometerData.magneticField.z);
}

陀螺仪(Gyro)

//导入框架
CoreMotion.framework
//导入头文件
#import 
  • push方式
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
    //1.创建运动管理者
    CMMotionManager *manager = [[CMMotionManager alloc] init];
    self.manager = manager;
    //2.判断陀螺仪是否可用
    if(self.manager.isGyroAvailable == NO) {
        NSLog(@"陀螺仪不可用");
    }
    //设置更新频率
    self.manager.gyroUpdateInterval = 1.0;
    //获取数据
    [self.manager 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);
    }];
  • pull方式
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
    //1.创建运动管理者
    CMMotionManager *manager = [[CMMotionManager alloc] init];
    self.manager = manager;
    //2.判断陀螺仪是否可用
    if(self.manager.isGyroAvailable == NO) {
        NSLog(@"陀螺仪不可用");
    }
    //获取数据
    [self.manager startGyroUpdates];
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"x:%f y:%f z:%f",self.manager.gyroData.rotationRate.x,self.manager.gyroData.rotationRate.y,self.manager.gyroData.rotationRate.z);
}

计步器的使用(CMStepCounter CMPedometer)

  • iOS8.0之前
//导入框架
CoreMotion.framework
//导入头文件
#import 
//计算步数
@property(nonatomic,strong)CMStepCounter *stepCounter;
//-------------------------------------------------------------
//1.判断计步器是否可用
    if(!CMStepCounter.isStepCountingAvailable){
        NSLog(@"计步器不可用");
    }
    //2.创建计算步数对象
    self.stepCounter = [[CMStepCounter alloc] init];
    //授权 info.plist NSMotionUsageDescription
    //3.开始计算步数
    //Queue:队列
    //updateOn:从几步开始计算步数
    [self.stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:1 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
        if(error){
            NSLog(@"%@",error);
        }
        self.stepLabel.text = [NSString stringWithFormat:@"%zd",numberOfSteps];
    }];
//计算步数授权
NSMotionUsageDescription
    
  • iOS8.0之后
//导入框架
CoreMotion.framework
//导入头文件
#import 
//iOS8之后计算步数
@property(nonatomic,strong)CMPedometer *pedometer;
//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);
    }];
//计算步数授权
NSMotionUsageDescription
    

小球运动(传感器应用)

//导入框架
CoreMotion.framework
//导入头文件
#import 
//运动管理者
@property(nonatomic,strong)CMMotionManager *motionManager;
//速度
@property(nonatomic,assign)CGPoint spend;
//小球
@property (weak, nonatomic) IBOutlet UIImageView *ballView;

//-----------------------------------------------------------
//1.创建运动管理者对象
    self.motionManager = [[CMMotionManager alloc] init];
    //2.判断加速计是否可用
    if(self.motionManager.isAccelerometerAvailable == NO){
        NSLog(@"加速计不可用");
    }
    //设置跟新时间
    self.motionManager.accelerometerUpdateInterval = 1/30.0;
    //3.获取加速计数据
    [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
        if(error){
            NSLog(@"加速度获取失败");
        }
        //在这个block中,时间是固定的,并且一段时间就会调用这个block
        NSLog(@"x:%f y:%f z:%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
        //x y 是x轴和y轴的加速度
        //将加速度转换成速度
        _spend.x += accelerometerData.acceleration.x;
        _spend.y -= accelerometerData.acceleration.y;
        //改变小球的位置
        CGRect ballFrame = self.ballView.frame;
        ballFrame.origin.x += _spend.x;
        ballFrame.origin.y += _spend.y;
        //防止小球超出四个边界
        //左边
        if(ballFrame.origin.x <= 0){
            ballFrame.origin.x = 0;
            //添加空气阻力效果
            _spend.x *= -0.7;
        }
        //右边
        if(ballFrame.origin.x >= self.view.bounds.size.width - ballFrame.size.width){
            ballFrame.origin.x = self.view.bounds.size.width - ballFrame.size.width;
            _spend.x *= -0.7;
        }
        //上边
        if(ballFrame.origin.y <= 0){
            ballFrame.origin.y = 0;
            _spend.y *= -0.7;
        }
        //下边
        if(ballFrame.origin.y >= self.view.bounds.size.height - ballFrame.size.height){
            ballFrame.origin.y = self.view.bounds.size.height - ballFrame.size.height;
            _spend.y *= -0.7;
        }
        //改变frame
        self.ballView.frame = ballFrame;
        
    }];

你可能感兴趣的:(传感器)