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

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
, 陀螺仪开发
, CoreMotion框架
螺旋仪详解
coremotion、ios coremotion、leap motion开发实例、ios coremotion 计步、ios coremotion使用,以便于您获取更多的相关知识。

时间: 2025-01-26 18:44:10

IOS 陀螺仪开发(CoreMotion框架)实例详解_IOS的相关文章

《验收测试驱动开发:ATDD实例详解》—第2章2.3节表格化测试

2.3 表格化测试 验收测试驱动开发:ATDD实例详解 现在,随着第一个实例的自动化,Tony可以简单地重用第一个测试的步骤对剩下的经讨论会确定的实例进行自动化.作为第一步,他需要将Valet.feature里的场景转换为一个表格化的实例场景框架.为了完成这个目标,他把30分钟的时长用一个占位符< parking duration >代替,并且把期望的价格用占位符< parking costs >代替,并把这个场景标记为场景框架.Tony把实际数值放在场景框架下记录所有实例数据的表

《验收测试驱动开发:ATDD实例详解》—第2章2.4节总结

2.4 总结验收测试驱动开发:ATDD实例详解代客泊车实例的自动化工作结束了.我们看到Tony从Cucumber开始.他在一个文本文件里用自然语言写下了第一个实例.然后他开始根据自己掌握的专业技能和信息来对他的第一个实例进行自动化.当Tony发现他的自动化代码无法继续写下去的时候,他开始与测试自动化开发人员Alex结对. Alex和Tony完成了ParkCalcPage驱动,它会在网页表单中填入停车场.开始和离开的日期和时间.在点击Calculate按钮之后,停车费的值将由一个函数返回.这样测试

Android的搜索框架实例详解_Android

基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

《验收测试驱动开发:ATDD实例详解》目录—导读

版权声明验收测试驱动开发:ATDD实例详解Authorized translation from the English language edition, entitled: ATDD by Example: A Practical Guide to Acceptance Test-Driven Development, 9780321784155 by Markus Gärtner, published by Pearson Education, Inc., publishing as Ad

Android的搜索框架实例详解

基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

《验收测试驱动开发:ATDD实例详解》—第1章1.4节基本实例

1.4 基本实例 验收测试驱动开发:ATDD实例详解 Tony: 现在,我们已经接近尾声了.对所有的实例,我们还有最后一步要做.我认为我已经理解了业务需求,但是我现在想减少实例的数量以便能反应出业务规则的本质.让我们最后一次重温这些表格,看看哪些实例可以而且应该被删除. Bill: 好的,让我们回头看一下.我想删除地面长期停车的一些实例. Bill删去了一些地面长期停车的实例,详见表1-6. Phyllis:这个3天的实例怎么样?我们已经覆盖了1天和6天的情况.我们可以把这个也删掉吗? Tony

《验收测试驱动开发:ATDD实例详解》—第1章1.5节总结

1.5 总结 验收测试驱动开发:ATDD实例详解 在这一章里,我们看到了业务专家.开发人员和测试人员是如何协作,在会议中挖掘出软件需求并对其达成共识的.虽然开始时Tony并没有贡献太多新的想法,但是他通过把实例可视化帮助大家达成了共识.凭借Tony独特的测试领域知识,他的贡献主要集中在使用表格来抽象描述各种停车方案的实例. 在Tony拿出第一个实例表格后,大家对需求的讨论变得更有意义了.开发人员Phyllis在他们已识别出的经济停车场的实例中发现了一个bug.她还要求对6小时零1分钟的实例进行了

《验收测试驱动开发:ATDD实例详解》—第1章1.3节经济停车和长期停车

1.3 经济停车和长期停车验收测试驱动开发:ATDD实例详解Phyllis: 那现在我们需要计算的第三种停车费用是什么? Bill: 还有就是经济停车.这个车场离机场比较远,所以价格比较便宜.我们有摆渡车可以把旅客带到候机楼. Phyllis: 好,那有多便宜呢? Bill:这个规则相对更复杂些.首先,停车费是每小时2美元. Tony:每天都是吗?还是说周末的费用是不一样的? Bill:不,是周几都无所谓. Tony:那么,在经济停车场停30分钟或者60分钟都是2美元,对吗? Bill:没错.

《验收测试驱动开发:ATDD实例详解》—第2章2.1节第一个测试用例

第2章 代客泊车的测试自动化验收测试驱动开发:ATDD实例详解团队决定从表1-11所示的停车场故事的代客泊车的实例开始做.大家决定使用Cucumber1来实现测试自动化.Cucumber使用Ruby语言将实例的数据表示和被测试系统粘合在一起.在Cucumber中,每个测试集合被称为一个特性(feature),每个特性由一个单独的文本文件来描述. 为了使用Cucumber来实现测试自动化,我们需要一组特性来记录测试数据,一些用来描述与被测应用交互的测试步骤定义,以及一套环境设置信息. Tony脑海