2013-12-03 3 views
3

Я новичок в разработке iOS.Как заменить UIAccelerometer на CMMotionManager?

Я следую учебному курсу от Ray Wenderlich, чтобы создать небольшое AR-приложение, основанное на местоположении. Однако в учебнике используется AR Toolkit, который не обновлялся некоторое время. UIAccelerometer, который он использует, уже устарел с iOS 5, поэтому, когда я пытаюсь запустить его на своем iPhone (iOS 7.0.4), Xcode говорит, что есть 3 предупреждения, и все они вызваны UIAccelerometer. warnings

В результате это приводит к тому, что все метки остаются в центре экрана один над другим, и наклон не работает вообще. problems

Согласно моим исследованиям, я предполагаю, что мне нужно использовать CMMotionManager вместо UIAccelerometer, но, как я уже говорил, я совершенно не знаком с разработкой iOS и понятия не имею, как его заменить.

Адрес source code. Я добавлю несколько небольших функций, чтобы вы могли вручную добавлять местоположения, которые не находятся в базе данных Google, но я не думаю, что эти функции приводят к этой проблеме.

Спасибо за помощь!

+0

Что касается замены 'UIAccelerometer', взгляните на [Почему акселерометр: didAccelerate: устарел в IOS5?] (Http://stackoverflow.com/questions/6742531/why-is-accelerometerdidaccelerate-deprecated-in- ios5/6763403 # 6763403) и [Простой обнаружение движения iPhone] (http://stackoverflow.com/questions/5214197/simple-iphone-motion-detect/5220796#5220796) – Kay

+0

@Kay Спасибо за ваш комментарий, но у меня все еще есть нет подсказки, чтобы зафиксировать это. Не могли бы вы потратить время на просмотр кода и дать мне несколько инструкций? Большое большое спасибо! – ylorn

ответ

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

} 
+0

это неправильно, движение устройства не эквивалентно получению данных акселерометра. Он содержит его, но он не является сырым, как UIAccelerometer, а также более интенсивным процессом. Вместо этого CoreMotion может обрабатывать акселерометр. – Pochi

+0

@Chiquis Является ли CMMotion не CoreMotion? Я смущен. Я думаю, вы хотите использовать CMAcceleration – kevinl

Смежные вопросы