iOS中的各种传感器

作品链接:
http://www.jianshu.com/users/1e0f5e6f73f6/top_articles

1.距离传感器

一.距离传感器的介绍

  • 距离传感器主要是检测是否有物品靠近
  • 默认情况下距离传感器是关闭状态,只需要打开即可

二.距离传感器代码的实现

  • 打开距离传感器
[UIDevice currentDevice].proximityMonitoringEnabled = YES;

  • 监听是有物品靠近还是离开
// 监听有物品靠近还是离开
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];

- (void)proximityStateDidChange
{
    if ([UIDevice currentDevice].proximityState) {
        NSLog(@"有物品靠近");
    } else {
        NSLog(@"有物品离开");
    }
}

2.加速计

一.加速计的介绍

  • 加速计的作用:用于检测设备的运动(比如摇晃)
  • 加速计的经典应用场景
    • 摇一摇
    • 计步器
  • 加速计的原理
    • 检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用,哪个方向运动了)
    • 根据加速度数值,就可以判断出在各个方向上的作用力度

二.获取加速计的值

1.旧的API获取

  • 在iOS4以前:使用UIAccelerometer,用法非常简单(到了iOS5就已经过期)

2.代码实现

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 1.获取 的对象
    UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
    
    // 2.设置代理 遵守代理协议UIAccelerometerDelegate
    accelerometer.delegate = self;
    
    // 3.设置采样间隔
    accelerometer.updateInterval = 0.2;
}

#pragma mark - UIAccelerometerDelegate方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
}

2.新的API获取

  • 从iOS4开始,苹果专门封装了一个和运动相关的框架:CoreMotion框架
  • 可以通过该框架来获取加速计的数值
  • 获取加速计也有两种方式
    • push方式:实时采集所有数据(采集频率高)

      • 创建运动管理者对象
      • 判断加速计是否可用
      • 设置采样间隔
      • 开始采集数据
    • pull方式:在有需要的时候,再主动去采集数据

    • 创建运动管理者对象

    • 判断加速计是否可用

    • 开始采样

    • 需要时通过运动管理者去获取数据

代码实现

1.导入第三方框架

#import <CoreMotion/CoreMotion.h>

2.创建运动管理者并懒加载


/** 运动管理者对象 */
@property (nonatomic, strong) CMMotionManager *manager;

#pragma mark - 懒加载
- (CMMotionManager *)manager
{
    if (_manager == nil) {
        _manager = [[CMMotionManager alloc] init];
    }
    
    return _manager;
}

3.push方式的代码实现

// 1.判断加速计是否可用
    if (!self.manager.isAccelerometerAvailable) {
        NSLog(@"加速计不可用,请跟换手机");
        return;
    }
    
    // 2.设置采样间隔
    self.manager.accelerometerUpdateInterval = 0.5;
    
    // 3.开始采集数据
    [self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@",error);
            return ;
        }
        
        CMAcceleration acceleration = accelerometerData.acceleration;
        NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
    }];

4.pull方式的代码实现

// 1.判断加速计是否可用
    if (!self.manager.isAccelerometerAvailable) {
        NSLog(@"加速计不可用,请跟换手机");
        return;
    }
    
    // 2.开始采集数据
    [self.manager startAccelerometerUpdates];
    
    CMAcceleration acceleration = self.manager.accelerometerData.acceleration;
    NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);


3.陀螺仪

一.陀螺仪的介绍

  • 陀螺仪主要用于检测设备的旋转
  • 应用场景:游戏中

二.陀螺仪信息的获取

  • 通过CoreMotion框架来获取

  • 两种方式来获取

    • push方式

      • 创建运动管理者
      • 判断陀螺仪是否可用
      • 设置采样间隔
      • 开始采样
    • pull方式

      • 创建运动管理
      • 判断陀螺仪是否可用
      • 开始采样
      • 在需要时通过运动管理获取数值
代码实现

1.导入第三方框架

#import <CoreMotion/CoreMotion.h>

2.创建运动管理者并懒加载

/** 运动管理者对象 */
@property (nonatomic, strong) CMMotionManager *manager;

#pragma mark - 懒加载
- (CMMotionManager *)manager
{
    if (_manager == nil) {
        _manager = [[CMMotionManager alloc] init];
    }
    
    return _manager;
}
```

3.push方式的代码实现

```
// 1.判断陀螺仪是否可以用
    if (!self.manager.isGyroAvailable) {
        NSLog(@"");
        return;
    }
    
    // 2.设置采样间隔
    self.manager.gyroUpdateInterval = 0.2;
    // 3.开始采样
    [self.manager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
        
        if (error) {
            NSLog(@"%@",error);
        }
        
        CMRotationRate rate = gyroData.rotationRate;
        NSLog(@"x:%f-y:%f-z:%f",rate.x, rate.y, rate.z);
```
4.pull方式代码的实现

```
// 1.判断陀螺仪是否可以用
    if (!self.manager.isGyroAvailable) {
        NSLog(@"");
        return;
    }

    // 2.开始采样
    [self.manager startGyroUpdates];
    
    CMRotationRate rate = self.manager.gyroData.rotationRate;
    NSLog(@"x:%f-y:%f-z:%f",rate.x, rate.y, rate.z);
```
---------------------------------------------------

# 4.摇一摇
- 监听用户是否摇晃了手机
- iOS自带的Shake监控API

```
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 检测到摇动 */
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动取消(被中断) */
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动结束 */
```
----------------------------------------------------
# 5.计步器

## 一.计步器的介绍
- 主要用来统计用户行走的步数

## 二.计步器的实现
- 计步器的API封装在了CoreMotion框架中
- iOS7时使用CoreMotion框架中的CMStepCounter
- iOS8时使用CoreMotion框架中的CMPedometer


#####  代码实现
- iOS7

```
// 1.判断计步器是否可以用
    if (![CMStepCounter isStepCountingAvailable]) {
        NSLog(@"计步器不可用");
        return;
    }
    
    // 2.创建计步器
    CMStepCounter *stepCounter = [[CMStepCounter alloc] init];
    // 3.开始计步
    [stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@",error);
        }
        NSLog(@"%ld",numberOfSteps);
    }];

```

- iOS8

```
// 1.判断计步器是否可用
    if (![CMPedometer isStepCountingAvailable]) {
        NSLog(@"计步器不可用");
        return;
    }
    
    // 2.创建计步器
    self.pedometer = [[CMPedometer alloc] init];
    // 3.开始计步
    [self.pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@",error);
            return;
        }
        NSLog(@"%@",pedometerData.numberOfSteps);
    }];
    
    // 3.查询前几天走了多少步 (最多查询7天)
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd";
    NSDate *fromDate = [formatter dateFromString:@"2016-09-07"];
    NSDate *toDate = [formatter dateFromString:@"2016-09-09"];
    [self.pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error);
            return ;
        }
        NSLog(@"%@",pedometerData.numberOfSteps);
    }];

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

推荐阅读更多精彩内容