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

这篇文章主要介绍了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 性能优化中离屏渲染的资料,提供了几种方法讲解了优化,有需要的小伙伴可以参考下
一般有Reachability和AFNetworking监测两种方式,都是第三方的框架,下文逐一详细给大家讲解,感兴趣的朋友一起看看吧
这篇文章主要介绍了IOS 实现摇一摇的操作的相关资料,需要的朋友可以参考下
这篇文章主要给大家总结了iOS实现渐变颜色的三种方法,分别是利用CAGradientLayer实现渐变、Core Graphics相关方法实现渐变以及用CAShapeLayer作为layer的mask属性实现,大家可以根据自己的需要选择使用,下面来一起看看吧。
这篇文章主要介绍了cmake ios终端下执行提示错误 iOS version not found, tested: [5.0;5.1;6.0;6.1;7.0;8.3]的解决方案的相关资料,需要的朋友可以参考下
之前看到很多环形进度条,看上去很酷,然后就试着学习他们的代码,结果发现实现一个环形进度条一点也不简单。我就在想一个简单的进度条有这么复杂吗?自己摸索后,有一个简单的实现方法。现在分享给大家,有需要的朋友们可以参考借鉴