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

11

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

6个回答

13

如果需要替代的话,你应该使用在iOS 4.0中引入的Core Motion framework。创建一个CMMotionManager实例,并告诉它通过startAccelerometerUpdatesToQueue:withHandler:方法来更新加速度计数据,在这个方法中传递一个NSOperationQueue和一个代码块,这个代码块会在指定的队列上执行并且在新的加速度计数据可用时被调用。


注意:iOS10+必须在info.plist中包含NSMotionUsageDescription。 - Albert Renshaw

5

4

我在这个链接上找到了一份有用的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

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);
         }];
    }
}

0

我是针对Swift 5.x回答的。

@available(iOS, introduced: 2.0, deprecated: 13.0, message: "UIAcceleration已被CoreMotion框架替代") public protocol UIAccelerometerDelegate : NSObjectProtocol { }

只需添加CoreMotion框架即可,无需遵循UIAccelerometerDelegate协议。

import CoreMotion

如果你想展示动画或者创建游戏,你可以从以下代码开始。
self.motionManager = CMMotionManager()
self.motionManager?.startAccelerometerUpdates()
if motionManager.isAccelerometerAvailable {          
  motionManager.startAccelerometerUpdates(to: .main) { (data, error) in
    if let myData = data {
        let x =  String(format: "%.3f",myData.acceleration.x)
        let y =  String(format: "%.3f",myData.acceleration.y)
        let z =  String(format: "%.3f",myData.acceleration.z)
    DispatchQueue.main.async { 
          var rect = self.anyObject.frame
         let movetoX = rect.origin.x + CGFloat(myData.acceleration.x * stepMoveFactor)
         let movetoY = rect.origin.y - CGFloat(myData.acceleration.y * stepMoveFactor)
         if ( movetoX > 0 && movetoX < SCREEN_WIDTH ) {
            rect.origin.x += CGFloat(myData.acceleration.x * stepMoveFactor)
         }
         if ( movetoY > 1 && movetoY < maxY ) {
           rect.origin.y -= CGFloat(myData.acceleration.y * stepMoveFactor) }
         }
    }
  }
}

如果需要,可以使用UIView.animate。该方法会启动一组要在视图上执行的动画。animations参数中的块对象包含一个或多个视图属性动画的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接