如何用CMMotionManager替代UIAccelerometer?

3
我刚接触iOS开发。
我跟随Ray Wenderlich的教程创建了一个小型的基于位置的AR应用程序。然而,该教程使用的AR Toolkit已经有一段时间没有更新了。它使用的UIAccelerometer自iOS 5以来已被弃用,因此当我尝试在我的iPhone(iOS 7.0.4)上运行它时,Xcode会显示3个警告,所有这些警告都是由UIAccelerometer引起的。warnings 导致的结果是所有标记都停留在屏幕中央,一个在另一个上面,而倾斜根本不起作用。 problems 根据我的研究,我认为我需要使用CMMotionManager而不是UIAccelerometer,但正如我之前所说,我完全是iOS开发的新手,不知道如何替换它。
这里是源代码。我添加了一些小功能,使您可以手动添加不在Google数据库中的位置,但我不认为是这些功能导致了问题。
提前感谢您的帮助!

@Kay 谢谢您的评论,但我仍然不知道如何解决它。您是否介意花些时间查看代码并给我一些指导?非常感谢! - ylorn
1个回答

2
请尝试这个链接: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可以处理加速度计。 - Pochi
@Chiquis CMMotion不是CoreMotion吗?我有点困惑。我猜你的意思是使用CMAcceleration。 - kevinl

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