如何在IOS中获取加速度计数据?

问题描述 投票:11回答:5

我使用UIAccelerotmeterDelegate方法accelerometer:didAccelerate:但最近该方法已在iOS 5.0中弃用。那么获取加速度计数据的另一种方法是什么?文档没有提到我们应该使用的替代方案。

ios accelerometer uiaccelerometer
5个回答
13
投票

您应该使用Core Motion framework(在iOS 4.0中引入)作为替代。创建一个CMMotionManager实例并告诉它startAccelerometerUpdatesToQueue:withHandler:,传递一个NSOperationQueue和一个块,当新的加速度计数据可用时,它将在指定的队列上执行。


5
投票

似乎UIAccelerometer和UIAccelerometerDelegate被CoreMotion框架取代。

你可以在这里找到答案:

Why is accelerometer:didAccelerate: deprecated in IOS5?

我希望它有所帮助。


4
投票

这是我从this链接找到的CoreMotion的有用示例代码。

    @interface ViewController ()

    @property (nonatomic, strong) CMMotionManager *motionManager; 
    @property (nonatomic, strong) IBOutlet UILabel *xAxis; 
    @property (nonatomic, strong) IBOutlet UILabel *yAxis; 
    @property (nonatomic, strong) IBOutlet UILabel *zAxis; 

    @end

    @implementation ViewController
    - (void)viewDidLoad 
    { 
      [super viewDidLoad];

      self.motionManager = [[CMMotionManager alloc] init]; 
      self.motionManager.accelerometerUpdateInterval = 1;

      if ([self.motionManager isAccelerometerAvailable]) 
      { 
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        [self.motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            dispatch_async(dispatch_get_main_queue(), ^{ 
              self.xAxis.text = [NSString stringWithFormat:@"%.2f",accelerometerData.acceleration.x]; 
              self.yAxis.text = [NSString stringWithFormat:@"%.2f",accelerometerData.acceleration.y]; 
              self.zAxis.text = [NSString stringWithFormat:@"%.2f",accelerometerData.acceleration.z];
            });
          }]; 
      } else 
      NSLog(@"not active"); 
    }
@end

3
投票

它被CoreMotion取代。见Motion Events


1
投票

首先将CoreMotion框架添加到项目中。然后:

#import <CoreMotion/CoreMotion.h>

@property (strong, nonatomic) CMMotionManager *motionManager;

- (void)viewDidLoad {
    _motionManager = [CMMotionManager new];
    _motionManager.accelerometerUpdateInterval = 0.01;       // 0.01 = 1s/100 = 100Hz
    if ([_motionManager isAccelerometerAvailable])
    {
        NSOperationQueue *queue = [NSOperationQueue new];
        [_motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error){
             NSLog(@"X = %0.4f, Y = %.04f, Z = %.04f",
                   accelerometerData.acceleration.x,
                   accelerometerData.acceleration.y,
                   accelerometerData.acceleration.z);
         }];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.