11

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

4

6 回答 6

13

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

于 2012-04-16T09:46:35.957 回答
5

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

你可以在这里找到答案:

为什么加速计:didAccelerate:在 IOS5 中已弃用?

我希望它有帮助。

于 2012-04-16T09:45:29.833 回答
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
于 2014-11-14T23:59:47.870 回答
3

将其替换为CoreMotion。请参阅运动事件

于 2012-04-16T09:48:12.757 回答
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);
         }];
    }
}
于 2015-06-27T10:17:33.777 回答
0

我正在为 Swift 5.x 回答这个问题。

@available(iOS, introduced: 2.0, deprecated: 13.0, message: "UIAcceleration has been replaced by the CoreMotion framework") 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 参数中的块对象包含用于为一个或多个视图的属性设置动画的代码。

于 2020-07-01T13:07:56.863 回答