IOS 陀螺仪开发(CoreMotion框架)实例详解

 更新时间:2016年10月11日 09:41:43   投稿:lqh  
这篇文章主要介绍了IOS 陀螺仪开发实例详解的相关资料,介绍了螺旋仪参数意义及CoreMotion框架,需要的朋友可以参考下

iOS陀螺仪 参数意义

self.mManager = [[CMMotionManager alloc]init];

  self.mManager.deviceMotionUpdateInterval = 0.5;

  

  if (self.mManager.gyroAvailable) {

    [self.mManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) {

      NSLog(@"RotationRate X:%.2lf Y:%.2lf Z:%.2lf ",motion.userAcceleration.x,motion.userAcceleration.y,motion.userAcceleration.z);

    }];

  }

 

x轴 头 靠近 负数 Y参数
x轴 头 远离 正数

y轴 左侧 高 正数 X参数
y轴 右侧 高 负数

下面介绍下  CoreMotion框架

 CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,现在一般都是用CoreMotion来处理加速度过程,不过由于UIAccelerometer比较简单,同样有人在使用。加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟以上动作,真机调试需要开发者账号。

加速计

加速计的x,y,z三个方向,参考下图:

如果只需要知道设备的方向,不需要知道具体方向矢量角度,那么可以使用UIDevice进行操作,还可以根据方向就行判断,具体可以参考一下苹果官网代码:

-(void) viewDidLoad {
   // Request to turn on accelerometer and begin receiving accelerometer events
   [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
}
 
- (void)orientationChanged:(NSNotification *)notification {
   // Respond to changes in device orientation
}
 
-(void) viewDidDisappear {
   // Request to stop receiving accelerometer events and turn off accelerometer
   [[NSNotificationCenter defaultCenter] removeObserver:self];
   [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
}

 当用户晃动设备的时候,系统会通知每一个在用的设备,可以使本身成为第一响应者:

- (BOOL)canBecomeFirstResponder {
  return YES;
}
 
- (void)viewDidAppear:(BOOL)animated {
  [self becomeFirstResponder];
}

处理Motion事件有三种方式,开始(motionBegan),结束(motionEnded),取消(motionCancelled):

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);

motionEnded方法中处理:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
  if (motion == UIEventSubtypeMotionShake)
  {
    // FlyElephant http://www.cnblogs.com/xiaofeixiang
    [[NSNotificationCenter defaultCenter] postNotificationName:@"FlyElephant" object:self];
  }
}

CoreMotion在处理加速计数据和陀螺仪数据的时是一个非常重要的框架,框架本身集成了很多算法获取原生的数据,而且能很好的展现出来,CoreMotion与UIKit不同,连接的是UIEvent而不是事件响应链。CoreMotion相对于接收数据只是更简单的分发motion事件。

CMMotionManager类能够使用到设备的所有移动数据(motion data),Core Motion框架提供了两种对motion数据的操作方式:

pull方式:能够以CoreMotionManager的只读方式获取当前任何传感器状态或是组合数据;

push方式:是以块或者闭包的形式收集到想要得到的数据并且在特定周期内得到实时的更新;

pull处理方式:

//判断加速计是否可用
if ([_motionManager isAccelerometerAvailable]) {
  // 设置加速计采样频率
  [_motionManager setAccelerometerUpdateInterval:1 / 40.0];
  [_motionManager startAccelerometerUpdates];
} else {
  NSLog(@"博客园-FlyElephant");
}

触摸结束:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
   CMAcceleration acceleration=_motionManager.accelerometerData.acceleration;
  NSLog(@"%f---%f---%f",acceleration.x,acceleration.y,acceleration.z);
}

push处理方式:

@property (strong,nonatomic) CMMotionManager *motionManager;
 
@property (strong,nonatomic) NSOperationQueue *quene;
_motionManager=[[CMMotionManager alloc]init];
//判断加速计是否可用
if ([_motionManager isAccelerometerAvailable]) {
    // 设置加速计频率
    [_motionManager setAccelerometerUpdateInterval:1 / 40.0];
    //开始采样数据
    [_motionManager startAccelerometerUpdatesToQueue:_quene withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        NSLog(@"%f---%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y);
    }];
} else {
    NSLog(@"博客园-FlyElephant");
}

时间设置频率:

 

陀螺仪

陀螺仪其实主要方法和方式和加速计没有区别,先看张陀螺仪旋转的角度图片:

陀螺仪更新数据也有两种方式,pull方式(startGyroUpdates),push方式(startGyroUpdatesToQueue):

static const NSTimeInterval gyroMin = 0.01;
 
- (void)startUpdatesWithSliderValue:(int)sliderValue {
 
   // Determine the update interval
   NSTimeInterval delta = 0.005;
   NSTimeInterval updateInterval = gyroMin + delta * sliderValue;
 
   // Create a CMMotionManager
   CMMotionManager *mManager = [(APLAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
   APLGyroGraphViewController * __weak weakSelf = self;
 
   // Check whether the gyroscope is available
   if ([mManager isGyroAvailable] == YES) {
     // Assign the update interval to the motion manager
     [mManager setGyroUpdateInterval:updateInterval];
     [mManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData *gyroData, NSError *error) {
        [weakSelf.graphView addX:gyroData.rotationRate.x y:gyroData.rotationRate.y z:gyroData.rotationRate.z];
        [weakSelf setLabelValueX:gyroData.rotationRate.x y:gyroData.rotationRate.y z:gyroData.rotationRate.z];
     }];
   }
   self.updateIntervalLabel.text = [NSString stringWithFormat:@"%f", updateInterval];
}
 
- (void)stopUpdates{
   CMMotionManager *mManager = [(APLAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
   if ([mManager isGyroActive] == YES) {
     [mManager stopGyroUpdates];
   }
}

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • iOS推送的那些事

    iOS推送的那些事

    关于iOS推送的那些事,你知道多少?本文带着大家一起了解iOS推送,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 详解如何使用ReactiveObjC

    详解如何使用ReactiveObjC

    RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够通过信号提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjC(OC) 和 ReactiveSwift(swift)。本文将详细介绍如何使用ReactiveObjC。
    2021-06-06
  • iOS开发中使用Picker View实现一个点菜应用的UI示例

    iOS开发中使用Picker View实现一个点菜应用的UI示例

    这篇文章主要介绍了iOS开发中使用Picker View实现一个点菜应用的UI示例,代码基于传统的Objective-C,需要的朋友可以参考下
    2016-01-01
  • iOS开发数独小游戏实例

    iOS开发数独小游戏实例

    这篇文章主要为大家详细介绍了iOS开发数独小游戏实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • iOS自定义UIBarButtonItem的target和action示例代码

    iOS自定义UIBarButtonItem的target和action示例代码

    这篇文章主要给大家介绍了关于iOS自定义UIBarButtonItem的target和action的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • IOS框架Spring常用的动画效果

    IOS框架Spring常用的动画效果

    本文给大家介绍的是在IOS开发中常用的动画效果以及自定义转场动画特效的代码,非常的简单实用,有需要的小伙伴可以参考下
    2016-03-03
  • iOS App开发中使cell高度自适应的黑魔法详解

    iOS App开发中使cell高度自适应的黑魔法详解

    这篇文章主要介绍了iOS App开发中使cell高度自适应的黑魔法详解,作者利用iOS8以后的新特性讲解了TableView、CollectionView中的cell高度自适应以及UITextView输入内容实时更新cell高度的方法,需要的朋友可以参考下
    2016-03-03
  • 12个iOS技术面试题及答案总结

    12个iOS技术面试题及答案总结

    这篇文章给大家总结了在iOS面试的时候可能会遇到的12个技术面试题,以及这些面试题但答案,这些答案只是给大家一些参考,大家可以再结合自己理解进行回答,有需要的朋友们下面来一起看看吧。
    2016-09-09
  • MAC 系统安装java并配置环境变量

    MAC 系统安装java并配置环境变量

    这篇文章主要介绍了MAC 系统安装java并配置环境变量的相关资料,需要的朋友可以参考下
    2017-03-03
  • Xcode 9下适配iPhoneX导致iOS 10不兼容问题的解决方法

    Xcode 9下适配iPhoneX导致iOS 10不兼容问题的解决方法

    这篇文章主要给大家介绍了关于Xcode 9下适配iPhoneX导致iOS 10不兼容问题的解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04

最新评论