代码之家  ›  专栏  ›  技术社区  ›  Steve

Swift CMMotion-显示手机角度

  •  4
  • Steve  · 技术社区  · 10 年前

    因此,我一直在四处寻找,试图了解核心运动,我正在努力寻找任何能将其降至初学者水平的东西。与其他主题相比,似乎没有太多的内容。

    我的目标:让UILabel显示手机的角度(我相信是z轴),0度是手机横向时的角度。

    我看到了 this article from NSHipster 我认为这是在正确的范围内发送给我的,所以我尝试重新创建在 .gif in this article 。当手机倾斜时,它会使UIImageView保持垂直……运气不好。我只是不明白所有这些代码片段是如何协同工作的,我想这是因为这是我第一次玩核心运动。

    我的问题:

    1) 有人能帮我重新创建那个链接中看到的移动图像View吗?这样我就可以研究它是如何协同工作的(最好是整个viewController.swift文件)。

    甚至更好

    2) 把一些代码放在一起,显示手机所处的角度。

    如果我能更具体一点,请告诉我。 非常感谢!

    更新:好吧,我很惊讶,并设法解决了它,然后来到这里发布了它,TJ Shae刚刚发布了答案,哈哈……花了很多时间,但我现在正在路上。

        import UIKit
        import CoreMotion
    
        class AngleGaugeViewController: UIViewController {
    
    @IBOutlet weak var rotX: UILabel!
    @IBOutlet weak var rotY: UILabel!
    @IBOutlet weak var rotZ: UILabel!
    @IBOutlet weak var theAngle: UILabel!
    
    @IBOutlet weak var imageView: UIImageView!
    
    
    let manager = CMMotionManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
    
        manager.gyroUpdateInterval = 0.1
        manager.accelerometerUpdateInterval = 0.1
    
        manager.startGyroUpdates()
        manager.startAccelerometerUpdates()
    
    
        let queue = NSOperationQueue.mainQueue
        manager.startGyroUpdatesToQueue(queue()) {
            (data, error) in
            // ...
        }
    
    
    
        if manager.deviceMotionAvailable {
            manager.deviceMotionUpdateInterval = 0.01
            manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) {
                [weak self] data, error in
    
                let rotation = atan2(data!.gravity.x, data!.gravity.y) - M_PI
                self?.imageView.transform = CGAffineTransformMakeRotation(CGFloat(rotation))
            }
        }
    
    
    
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    }

    1 回复  |  直到 10 年前
        1
  •  5
  •   TJ Shae    10 年前

    嗯,NSHipster代码第一次完美地为我工作:]这是UIViewController代码:

    import UIKit
    import CoreMotion
    
    class ViewController: UIViewController {
    
    @IBOutlet weak var imgView: UIImageView!
    
    let manager = CMMotionManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        if manager.deviceMotionAvailable {
            manager.deviceMotionUpdateInterval = 0.01
            manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) {
                (data, error) in
                if let data = data {
                    let rotation = atan2(data.gravity.x, data.gravity.y) - M_PI
                    self.imgView.transform = CGAffineTransformMakeRotation(CGFloat(rotation))
                }
            }
        }
    }
    
    }
    
    推荐文章