开发杂谈iOS 砖家纪实录移动端设计研发

iOS中的各种传感器

2016-09-09  本文已影响1202人  打电话记错号码的人

作品链接:
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.加速计

一.加速计的介绍

二.获取加速计的值

1.旧的API获取

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获取

代码实现

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.陀螺仪

一.陀螺仪的介绍

二.陀螺仪信息的获取

代码实现

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

```
上一篇 下一篇

猜你喜欢

热点阅读