我正在使用该UIAccelerotmeterDelegate
方法accelerometer:didAccelerate:
,但最近该方法在 iOS 5.0 中已被弃用。那么获取加速度计数据的替代方法是什么?文档没有提到我们应该使用的替代方案。
6 回答
您应该使用Core Motion 框架(在 iOS 4.0 中引入)作为替代。创建一个实例CMMotionManager
并告诉它startAccelerometerUpdatesToQueue:withHandler:
,传递给它一个NSOperationQueue
和一个块,当有新的加速度计数据可用时,它将在指定的队列上执行。
UIAccelerometer 和 UIAccelerometerDelegate 似乎被 CoreMotion 框架取代了。
你可以在这里找到答案:
为什么加速计:didAccelerate:在 IOS5 中已弃用?
我希望它有帮助。
这是我从这个链接中为 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
将其替换为CoreMotion
。请参阅运动事件。
首先将 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);
}];
}
}
我正在为 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 参数中的块对象包含用于为一个或多个视图的属性设置动画的代码。