传感器

  • 加速计 陀螺仪 磁力计 距离传感器 计步器 摇一摇
  • 传感器是一种感应 检测装置
  • 作用:用于感应 检测设备周边信息
    在地图应用中,能判断出手机头面向的方向
    一关灯,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 <CoreMotion/CoreMotion.h>
  • 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<UITouch *> *)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 <CoreMotion/CoreMotion.h>
  • 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<UITouch *> *)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 <CoreMotion/CoreMotion.h>
  • 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<UITouch *> *)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 <CoreMotion/CoreMotion.h>
//计算步数
@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];
    }];
//计算步数授权
<key>NSMotionUsageDescription</key>
    <string></string>
  • iOS8.0之后
//导入框架
CoreMotion.framework
//导入头文件
#import <CoreMotion/CoreMotion.h>
//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);
    }];
//计算步数授权
<key>NSMotionUsageDescription</key>
    <string></string>

小球运动(传感器应用)

//导入框架
CoreMotion.framework
//导入头文件
#import <CoreMotion/CoreMotion.h>
//运动管理者
@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;
        
    }];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容