美文网首页
Core Motion(传感器)

Core Motion(传感器)

作者: 搬砖的crystal | 来源:发表于2019-10-28 14:04 被阅读0次

一、距离传感器

- (void)viewDidLoad {
    [super viewDidLoad];
    //打开距离传感器,开启后会自动控制屏幕亮度
    [UIDevice currentDevice].proximityMonitoringEnabled = YES;
    //监听有物品靠近还是离开
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
}
- (void)proximityStateDidChange{
    if ([UIDevice currentDevice].proximityState) {
        NSLog(@"有物品靠近  屏幕变暗");
    } else {
        NSLog(@"有物品离开  屏幕变亮");
    }
}

二、摇一摇

#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}
//实现3个代理方法即可
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    NSLog(@"开始摇一摇");
}

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

三、Core Motion

CMMotionManager 是 Core Motion 库的核心类,负责获取和处理手机的运动信息,它可以获取的数据有:

  • 加速度,标识设备在三维空间中的瞬时加速度
  • 陀螺仪,标识设备在三个主轴上的瞬时旋转
  • 磁场信息,标识设备相对于地球磁场的方位
  • 设备运动数据,标识关键的运动相关属性,包括设备用户引起的加速度、姿态、旋转速率、相对于校准磁场的方位以及相对于重力的方位等,这些数据均来自于 Core Motion 的传感器融合算法,从这一个数据接口即可获取以上三种数据,因此使用较为广泛。

CMMotionManager 有 push 和 pull 两种方式获取数据:

  • push 方式实时获取数据,采样频率高。
  • pull 方式仅在需要数据时采集数据,Apple 更加推荐这种方式获取数据。
1.加速计

作用:检测设备的运动
(1)pull方式

#import "ViewController.h"
//需要导入头文件
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()

@property(nonatomic, strong) CMMotionManager *mgr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.判断加速计是否可用
    self.mgr = [[CMMotionManager alloc]init];
    if (!self.mgr.isAccelerometerAvailable) {
        NSLog(@"加速计坏了,请更换手机");
        return;
    }
    // 2.开始采样
    [self.mgr startAccelerometerUpdates];
}
//  3.点击屏幕开始获取加速计的值
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
    NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
}
@end

(2)push方式

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()

@property(nonatomic, strong) CMMotionManager *mgr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.创建运动管理者
    self.mgr = [[CMMotionManager alloc] init];
    // 2.判断加速计是否可用
    if (!self.mgr.isAccelerometerAvailable) {
        NSLog(@"加速计不可用");
        return;
    }
    // 3.设置采样间隔
    self.mgr.accelerometerUpdateInterval = 1.0;
    // 4.开始采样
    [self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
        // 1.判断获取的过程中是否有错误
        if (error) {
            NSLog(@"%@", error);
            return;
        }
        // 2.获取加速计的数值
        CMAcceleration acceleration = accelerometerData.acceleration;
        NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
    }];
}
@end
2.陀螺仪

作用:检测设备的旋转
(1)pull

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()

@property(nonatomic, strong) CMMotionManager *mgr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.mgr = [[CMMotionManager alloc]init];
    // 1.判断陀螺仪是否可用
    if (!self.mgr.isGyroAvailable) {
        NSLog(@"陀螺仪不可用,请更换手机");
        return;
    }
    // 2.开始采样
    [self.mgr startGyroUpdates];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    CMRotationRate rate = self.mgr.gyroData.rotationRate;
    NSLog(@"x:%f y:%f z:%f", rate.x, rate.y ,rate.z);
}
@end

(2)push

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()

@property(nonatomic, strong) CMMotionManager *mgr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.创建管理者
    self.mgr = [[CMMotionManager alloc] init];
    // 2.判断陀螺仪是否可用
    if (!self.mgr.isGyroAvailable) {
        NSLog(@"陀螺仪不可用,请更换手机");
        return;
    }
    // 3.设置采样间隔
    self.mgr.gyroUpdateInterval = 1.0 / 3;
    // 4.开始采样
    [self.mgr startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error);
            return;
        }
        // 获取陀螺仪的数值
        CMRotationRate rate = gyroData.rotationRate;
        NSLog(@"x:%f y:%f z:%f", rate.x, rate.y ,rate.z);
    }];
}
@end
3.计步

需要在info.plist中配置Privacy - Motion Usage Description的权限

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.判断计步器是否可用
    if (![CMPedometer isStepCountingAvailable]) {
        NSLog(@"计步器不可用");
        return;
    }
    // 2.创建计步器对象
    CMPedometer *pedometer = [[CMPedometer alloc] init];
    // 3.开始计步
    [pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error);
            return;
        }
        NSLog(@"%@", pedometerData.numberOfSteps);
    }];
    
    // 4.查询之前走了多少步
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    NSDate *fromDate = [fmt dateFromString:@"2019-10-22"];
    NSDate *toDate = [fmt dateFromString:@"2019-10-29"];
    [pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error);
            return;
        }
        NSLog(@"%@", pedometerData.numberOfSteps);
    }];
}
@end

相关文章

  • Core Motion(传感器)

    一、距离传感器 二、摇一摇 三、Core Motion CMMotionManager 是 Core Motion...

  • iOS传感器篇:CoreMotion初探

    Core Motion 加速计程序,螺旋仪,步数计,环境相关的事件 iOS传感器篇:CoreMotion使用目录索...

  • iOS CoreMotion的使用

    CoreMotion Core Motion可以让开发者从各个内置传感器那里获取未经修改的传感数据,并观测或响应设...

  • 来说说CoreMotion

    关于CoreMotion Core Motion可以让开发者从各个内置传感器那里获取未经修改的传感数据,并观测或响...

  • iOS Core Motion基本使用

    Core Motion可以让开发者从各个内置传感器那里获取未经修改的传感数据,并观测或响应设备各种运动和角度变化。...

  • Core Motion

    Core Motion 处理加速计、陀螺仪、计步器和环境相关事件的框架。 概览 CoreMotion 会报告来自于...

  • 19 传感器

    传感器的分类Motion sensors 加速度传感器,重力传感器,陀螺仪Environment sensors ...

  • Ios面试复习--传感器

    搭载在Ios设备上的传感器 运动传感器(Motion)/加速传感器、加速计(Accelermeter Sensor...

  • Android传感器

    一.Android的三大类传感器 Android传感器按大方向划分大致有这么三类传感器:动作(Motion)传感器...

  • 传感器

    一.Android的三大类传感器 Android传感器按大方向划分大致有三类传感器:动作(Motion)传感器、环...

网友评论

      本文标题:Core Motion(传感器)

      本文链接:https://www.haomeiwen.com/subject/pozsvctx.html