2017-11-23 2 views
0

motionManager에 대한 장치 동작 호출의 gravityY 매개 변수를 기반으로하는 수준의 iPhone 응용 프로그램이 있습니다. 휴대 전화의 음높이를 고정 시켰습니다. 휴대 전화가 x 축을 기준으로 평평한 평면 (지면에 평평한 평면)을 기준으로 상승 또는 하강 하는지를 사용자에게 보여주고 싶습니다. 좌우로 또는 회전하여 는 관련이 없습니다. 그렇게하기 위해 레벨 (바)을 따라 표시기 (빨간색 일 때 빨간색)를 밀기 위해 앱을 프로그래밍했습니다. 최대 이동 거리는 레벨의 끝 부분입니다.스위프트 3 장치 동작 중력

수준은 훌륭합니다 ... 사용자가 휴대 전화를 잠그고 등 포켓에 넣을 때까지 올바른 값이 표시됩니다. 이 단계에서는 레벨 표시기가 레벨의 한쪽 끝 (주머니에서 들어 올려지는 휴대 전화의 끝)으로 이동하고 전화기를 꺼내고 잠금을 해제하면 앱이 즉시 레벨을 복원하지 않습니다. 수준을 복원하기 위해 수동 함수 호출을 수행하더라도 레벨이 변경되었습니다. 약 5 분 후, 레벨 자체를 복원하는 것 같습니다.

func getElevation() { 

    //now get the device orientation - want the gravity value 
    if self.motionManager.isDeviceMotionAvailable { 

     self.motionManager.deviceMotionUpdateInterval = 0.05 

     self.motionManager.startDeviceMotionUpdates(
      to: OperationQueue.current!, withHandler: { 
       deviceMotion, error -> Void in 

       var gravityValueY:Double = 0 

       if(error == nil) { 
        let gravityData = self.motionManager.deviceMotion 
        let gravityValueYRad = (gravityData!.gravity.y) 
        gravityValueY = round(180/(.pi) * (gravityValueYRad)) 

        self.Angle.text = "\(String(round(gravityValueY)))" 
       } 
       else { 
        //handle the error 
        self.Angle.text = "0" 
        gravityValueY = 0 
       } 
       var elevationY = gravityValueY 
       //limit movement of bubble 
       if elevationY > 45 { 
        elevationY = 45 
       } 
       else if elevationY < -45 { 
        elevationY = -45 
       } 

       let outofLevel: UIImage? = #imageLiteral(resourceName: "levelBubble-1") 
       let alignLevel: UIImage? = #imageLiteral(resourceName: "levelBubbleGR-1") 

       let highElevation:Double = 1.75 
       let lowElevation:Double = -1.75 

       if highElevation < elevationY { 
        self.bubble.image = outofLevel 
       } 
       else if elevationY < lowElevation { 
        self.bubble.image = outofLevel 
       } 
       else { 
        self.bubble.image = alignLevel 
       } 
       // Move the bubble on the level 
       if let bubble = self.bubble { 
        UIView.animate(withDuration: 1.5, animations: {() -> Void in 
         bubble.transform = CGAffineTransform(translationX: 0, y: CGFloat(elevationY)) 
        }) 
       } 
     }) 
    } 
} 

내가 (2-3 초) 즉시 복원 수준을 싶습니다 여기

는 코드입니다. 강제 교정이나 업데이트 할 방법이 없습니다. 이것은 나의 첫 번째 게시물 .... 감사합니다.

편집 - 나는 다음 코드와 어떤 애니메이션 않고 별도의 응용 프로그램을 설정하는 시도 : 그래서 .... ....

// 

import UIKit 
import CoreMotion 

class ViewController: UIViewController { 

let motionManager = CMMotionManager() 

@IBOutlet weak var angle: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func startLevel(_ sender: Any) { 
    startLevel() 
} 

func startLevel() { 
//now get the device orientation - want the gravity value 
if self.motionManager.isDeviceMotionAvailable { 

self.motionManager.deviceMotionUpdateInterval = 0.1 
self.motionManager.startDeviceMotionUpdates(
to: OperationQueue.current!, withHandler: { 
deviceMotion, error -> Void in 

var gravityValueY:Double = 0 

if(error == nil) { 
    let gravityData = self.motionManager.deviceMotion 
    let gravityValueYRad = (gravityData!.gravity.y) 
    gravityValueY = round(180/(.pi) * (gravityValueYRad)) 
    } 
else { 
    //handle the error 
    gravityValueY = 0 
    } 
self.angle.text = "(\(gravityValueY))" 
})} 
} 
} 

아직도 정확히 같은 방식으로 동작

답변

0

확인을 나는 이것을 시행 착오를 통해 알았다.

func stopGravity() { 
if self.motionManager.isDeviceMotionAvailable { 
    self.motionManager.stopDeviceMotionUpdates() 
    } 
} 

나는 내가 그 함수를 호출하면 레벨이 항상 원래보기로 반환 할 때 다음, 새로운보기로 이동 업데이트를 다시 시작하여 예를 들어, 제대로 설정되어 있음을 발견 다음과 같이 첫째, 나는 stopGravity 기능을 내장 . 장치를 잠 그거나 홈 버튼을 클릭 할 때 동일한 기능을 호출 한 다음 다시로드하거나보기로 돌아갈 때 중력 기능을 다시 시작해야했습니다.

는 ...) 나는이 (가)있는 viewDidLoad (에 다음을 삽입하는 것이

 NotificationCenter.default.addObserver(self, selector: #selector(stopGravity), name: NSNotification.Name.UIApplicationWillResignActive, object: nil) 
    NotificationCenter.default.addObserver(self, selector: #selector(stopGravity), name: NSNotification.Name.UIApplicationWillTerminate, object: nil) 

이것은 AppDelegate에 통지하고 기능을 실행을 수행합니다. 즉시 문제가 해결되었습니다.