【问题标题】:How to replace UIAccelerometer with CMMotionManager?如何用 CMMotionManager 替换 UIAccelerometer?
【发布时间】:2013-12-18 20:59:26
【问题描述】:

我是 iOS 开发新手。

我按照Ray Wenderlich 的教程创建了一个基于位置的小型 AR 应用程序。但是,本教程使用了一段时间未更新的AR Toolkit。它使用的 UIAccelerometer 自 iOS 5 以来已被弃用,所以当我尝试在我的 iPhone(iOS 7.0.4)上运行它时,Xcode 说有 3 个警告,所有这些都是由 UIAccelerometer 引起的。

它导致的结果是所有标记都停留在屏幕中心一个在另一个之上,并且倾斜根本不起作用。

根据我的研究,我想我需要做的是使用 CMMotionManager 而不是 UIAccelerometer,但正如我之前所说,我对 iOS 开发完全陌生,不知道如何替换它。

这里是source code。我添加了一些小功能,以便您可以手动添加不在 Google 数据库中的位置,但我不认为是这些功能导致了问题。

提前感谢您的帮助!

【问题讨论】:

标签: ios iphone accelerometer augmented-reality core-motion


【解决方案1】:

试试这个链接:https://www.inkling.com/read/learning-ios-programming-alasdair-allan-2nd/chapter-9/the-core-motion-framework

我正在学习一些可以用 UIAccelerometer 翻译一些内容的花絮

[self setAccelometerManager [UIAccelerometer sharedAccelerometer]];

可能变成

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

设置手动更新间隔,如

[[self accelerometerManager] setUpdateInterval: 0.25];

你可以拥有

self.motionManager.accelerometerUpdateInterval = 0.25;

并释放委托

self.accelerometerManager.delegate = nil;

现在是

[self.motionManager stopDeviceMotionUpdates];

同样来自链接,我最终做了这样的事情:

motionManager = [[CMMotionManager alloc] init];

motionManager.accelerometerUpdateInterval  = 1.0/10.0; // Update at 10Hz

if (motionManager.accelerometerAvailable) {
    queue = [NSOperationQueue currentQueue];
    [motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        switch (currentOrientation) {
            case UIDeviceOrientationLandscapeLeft:
                viewAngle = atan2(accelerometerData.acceleration.x, accelerometerData.acceleration.z);
                break;
            case UIDeviceOrientationLandscapeRight:
                viewAngle = atan2(-accelerometerData.acceleration.x, accelerometerData.acceleration.z);
                break;
            case UIDeviceOrientationPortrait:
                viewAngle = atan2(accelerometerData.acceleration.y, accelerometerData.acceleration.z);
                break;
            case UIDeviceOrientationPortraitUpsideDown:
                viewAngle = atan2(-accelerometerData.acceleration.y, accelerometerData.acceleration.z);
                break;  
            default:
                break;
        }
        [self updateCenterCoordinate];
    }];

}

【讨论】:

  • 这是错误的,设备运动不等同于获取加速度计数据。它确实包含它,但它不像 UIAccelerometer 那样原始,而且它的过程更加密集。 CoreMotion 可以处理加速度计。
  • @Chiquis CMMotion 不是 CoreMotion 吗?我糊涂了。我猜你的意思是使用 CMAcceleration
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多