iOS中CoreMotion框架(加速计 陀螺仪 磁力计)

分享是每个优秀的程序员所必备的品质


  • 加速计 : 检测力在某个方向上有作用,它是三维全方向感知的,手机平面左右两侧对应加速计x轴负正,手机上下对应y轴正负,垂直手机平面朝里朝外对应z轴正负。当 iPhone静止时,受到的重力加速度为1g,根据摆放位置分摊在三个轴上,比如z轴g = -1说明手机正面朝上平放,而不管怎么放置,三轴方向的加速度都不会超过1g。但当运动状态时,就可能出现特别的数值,正是根据这些数值我们可以判断出运动方向和速度并用于应用中。

  • 陀螺仪 : 检测转动的角速度 ,也叫角加速度传感器!是用来测量角速度或维持方向的设备基于角动量守恒原理。陀螺仪都是三轴定位。iPhone内置的陀螺仪可以在6个方向上感知运动,采用了微型的、电子化的振动陀螺仪。简而言之吧,这玩意就是你去哪儿和在哪儿都靠他。包括世面上的一些游戏大作都是基于这个东西的,还有一些运动系列的app也不得不用到他!

  • 磁力计 : 检测磁场变化, 测试磁场强度和方向,一般用于定位设备的方位。可以测量出当前设备与东南西北四个方向上的夹角。


加速计分为push和pull两种方式:

首先创建一个管理类的对象

/** 运动管理器对象*/
@property (nonatomic, strong) CMMotionManager *motionMgr;
/**
 加速计push 方式:根据设置的采样间隔定时输出结果
 */
- (void)accelerometerPush{
    // 1. 创建CMMotionManager对象
    self.motionMgr = [[CMMotionManager alloc]init];
    
    // 2. 判断加速计是否可用(基本上涉及到硬件的都需要判断一下是否可用)
    if(![self.motionMgr isAccelerometerAvailable]){
        NSLog(@"加速计不可用");
        return;
    }
    
    // 3. 设置采样间隔
    self.motionMgr.accelerometerUpdateInterval = 1 ;
    
    // 4.开始采样
    [self.motionMgr startAccelerometerUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
        // 5. 获取data中的值
        // 正值负值: 轴的方向, 哪个指向地面, 就会打印出打个方向的值
        // 只要在某个轴上, 进行快速移动, 那么值就会发生变化
        CMAcceleration acceleration = accelerometerData.acceleration;
        NSLog(@"x : %f, y : %f, z : %f", acceleration.x, acceleration.y, acceleration.z);
    }];
}
/**
 加速计Pull方式 : 在需要的时候来获取值(如点击屏幕获取)
 */
- (void)accelerometerPull{
 
 // 1. 创建CMMotionManager对象
    self.motionMgr = [CMMotionManager new];
    
    // 2. 判断加速计是否可用
    if (![self.motionMgr isAccelerometerAvailable]) {
        return;
    }
    
    // 3. 开始采样
    [self.motionMgr startAccelerometerUpdates];
}
/**
点击屏幕获取值
 */
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
  [super touchesBegan:touches withEvent:event];

    // 4. 点击时获取加速计的值,运动管理器会记录所有的值, 在自己的属性中
   CMAcceleration acceleration =    self.motionMgr.accelerometerData.acceleration;
    NSLog(@"x : %f, y : %f, z : %f", acceleration.x, acceleration.y, acceleration.z);
}


陀螺仪分为push和pull两种方式:

 /**
  陀螺仪Push方式
  */
- (void)gyroPush
{
    // 1. 创建CMMotionManager对象
    self.motionMgr = [CMMotionManager new];
    
    // 2. 判断陀螺仪是否可用
    if (![self.motionMgr isGyroAvailable]) {
        return;
    }
    
    // 3. 设置采样间隔 单位是秒 --> 只有push方式需要采样间隔
    self.motionMgr.gyroUpdateInterval = 1;
    
    //4. 开始采样
    [self.motionMgr startGyroUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
        
        //5 获取data中的数据值
        
        // 正值负值: 轴的方向, 哪个指向地面, 就会打印出打个方向的值
        // 只要在某个轴上, 进行快速移动, 那么值就会发生变化
        CMRotationRate rotationRate = gyroData.rotationRate;
        
        NSLog(@"x : %f, y : %f, z : %f", rotationRate.x, rotationRate.y, rotationRate.z);
        
    }];
    
}

 /**
  加速计Pull方式  :在需要的时候来获取值(点击屏幕获取值)
  */
- (void)gyroPull
{
    // 1. 创建CMMotionManager对象
    self.motionMgr = [CMMotionManager new];
    
    // 2. 判断加速计是否可用
    if (![self.motionMgr isGyroAvailable]) {
        return;
    }

     // 3. 开始采样
    [self.motionMgr startGyroUpdates];
}
/**
点击屏幕获取值
 */
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesBegan:touches withEvent:event];
    // 4 点击时获取陀螺仪的值
        CMRotationRate rotationRate = self.motionMgr.gyroData.rotationRate;
    
        NSLog(@"x : %f, y : %f, z : %f", rotationRate.x, rotationRate.y, rotationRate.z);
}

磁力计分为push和pull两种方式:

/**
 磁力计Push方式
 */
- (void)magnetometerPush
{
    
    // 1. 创建CMMotionManager对象
    self.motionMgr = [CMMotionManager new];
    
    // 2. 判断磁力计是否可用
    if (![self.motionMgr isMagnetometerAvailable]) {
        return;
    }
    
    // 3. 设置采样间隔 单位是秒 --> 只有push方式需要采样间隔
    self.motionMgr.magnetometerUpdateInterval = 1;
    
    // 4. 开始采样
    [self.motionMgr startMagnetometerUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMMagnetometerData * _Nullable gyroData, NSError * _Nullable error) {
        
        // 5 获取data中的数据  单位:特斯拉,
        CMMagneticField magneticField = self.motionMgr.magnetometerData.magneticField;
        
        NSLog(@"x : %f, y : %f, z : %f", magneticField.x, magneticField.y, magneticField.z);
    }];
}
/**
 磁力计Pull方式 --> 在需要的时候来获取值
 */
- (void)magnetometerPull{

    // 1. 创建CMMotionManager对象
    self.motionMgr = [CMMotionManager new];
    
    // 2. 判断磁力计是否可用
    if (![self.motionMgr isMagnetometerAvailable]) {
        return;
    }
    
    // 3. 开始采样
    [self.motionMgr startMagnetometerUpdates];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 // 4. 点击时获取磁力计的值
    CMMagneticField magneticField = self.motionMgr.magnetometerData.magneticField;
    
    NSLog(@"x : %f, y : %f, z : %f", magneticField.x, magneticField.y, magneticField.z);

}

个人浅见,有误的地方欢迎指正

你可能感兴趣的:(iOS中CoreMotion框架(加速计 陀螺仪 磁力计))