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))"
})}
}
}
아직도 정확히 같은 방식으로 동작