2016-10-07 4 views
0

저는 CMMotionManager를 사용하여 장치 태도를 얻었으며 처음 시작할 때 완벽하게 작동하는 특이한 문제에 부딪 혔습니다. 그러나 멈추고 시작한 후 yaw에 대해 두 배의 숫자가 나타납니다.중지하고 다시 시작한 후 CMMotionManager가 잘못된 요를보고하는 이유는 무엇입니까?

startDeviceMotionUpdates(using: .xTrueNorthZVertical)을 사용하여 시작하고 SceneKit 장면의 렌더링 루프에서 요 값을 확인하십시오. 전화기를 테이블 위에 놓고 90 ° 회전 시키면 편주에 90 °의 변화가 나타납니다. 완전한.

stopDeviceMotionUpdates()을 사용하여 멈 추면 다시 시작하고 동일한 90 ° 회전을 수행하면 90 ° 동일한 변경이 일어날 것으로 예상됩니다. 하지만 대신 180 °의 회전을 보여줍니다!

이것은 처음에만 (using:) 구문으로 시작할 때 발생하는 것으로 보입니다. xCode 8.0을 사용하여 iOS 10.0.2를 사용하는 iPhone 5에서 테스트하고 있습니다.

은, 다시은 "게임"템플릿을 사용하여 새 프로젝트를 만들고 다음과 GameViewController.swift의 코드를 교체하려면 :

import UIKit 
import SceneKit 
import CoreMotion 

class GameViewController: UIViewController, SCNSceneRendererDelegate { 

    static let motionManager = CMMotionManager() 

    var scnView: SCNView! 
    var scnScene: SCNScene! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     scnView = self.view as! SCNView 
     scnView.delegate = self 
     scnScene = SCNScene() 
     scnView.scene = scnScene 
     scnView.isPlaying = true 

     GameViewController.motionManager.startDeviceMotionUpdates(using: .xTrueNorthZVertical) 
     // stop and start it again to cause doubling 
     GameViewController.motionManager.stopDeviceMotionUpdates() 
     GameViewController.motionManager.startDeviceMotionUpdates(using: .xTrueNorthZVertical) 

    } 

    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { 
     if let motion = GameViewController.motionManager.deviceMotion { 
      print(Int(motion.attitude.yaw * 180/M_PI)) 
     } 
    } 
} 

이 코드는 CMMotionManger 시작 후 즉시 중지하고 다시 시작합니다. 휴대 전화를 90 ° 회전하면 180 °의 편주를 볼 수 있습니다. 분명히 이것은 실용적인 예가 아니며 문제를 보여주는 간단한 버전 일뿐입니다. 실제로 사용하는 경우, CMMotionManager를 사용하고있는 SceneKit 뷰가 닫히면 CMMotionManager가 중지되고 다른 SceneKit 뷰가 열릴 때 CMMotionManager가 다시 시작됩니다.

제 해결 방법은 CMMotionManager를 시작한 후에는 절대로 중지하지 않는 것입니다. 작동하지만 앱에서 더 이상 기기 모션 업데이트를 처리하지 않으려면 stopDeviceMotionUpdates()를 호출해야한다고 명시된 설명서에 나와 있습니다. 따라서 위대한 해결책이 아닌 것 같습니다.

왜 멈춤과 시작 후에 CMMotionManager가 잘못된 값을 주는가? 그것을 고칠 수있는 방법은 무엇입니까?

답변

0

이 동작은 iOS 10.1을 설치 한 후에 사라 졌으므로 아마도 수정 된 버그 일 것입니다.

0

CMMotion 관리자는 시작 함수를 호출했을 때 각도를 돌려줍니다.

업데이트가 필요한 경우 업데이트를 중지하면 안됩니다. 이전 위치와 관련시킬 필요가 없을 때 중지하십시오.

+0

내 실제 사용 사례에서, 내가 사용하고있는 SceneKit 뷰가 닫힐 때 CMMotionManager를 중지하고 다른 SceneKit 뷰가 열리면 다시 시작합니다. 내 질문에 예를 들어 문제를 보여주는 최소한의 예입니다. – Robert

관련 문제