ios 如何用CMMotionManager替换UIAccelerometer?

moiiocjp  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(84)

我是iOS开发新手。
我遵循Ray Wenderlich的教程来创建一个基于位置的AR应用程序。但是,本教程使用的AR Toolkit已经有一段时间没有更新了。它使用的UI加速计已经从iOS 5开始被弃用,所以当我尝试在我的iPhone(iOS 7.0.4)上运行它时,Xcode说有3个警告,它们都是由UI加速计引起的。

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

根据我的研究,我想我需要做的是使用CMMotionManager而不是UIAccelerometer,但正如我之前所说,我对iOS开发完全陌生,不知道如何替换它。
这是source code。我添加了一些小函数,这样你就可以手动添加不在Google数据库中的位置,但我不认为是这些函数导致了问题。
提前感谢您的帮助!

vnzz0bqm

vnzz0bqm1#

请尝试以下链接:https://www.inkling.com/read/learning-ios-programming-alasdair-allan-2nd/chapter-9/the-core-motion-framework
我正在学习一些花絮,翻译一些什么与UI加速计

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

}

相关问题