首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift CMMotionManager让摇摆,俯仰,偏航工作

Swift CMMotionManager让摇摆,俯仰,偏航工作
EN

Stack Overflow用户
提问于 2016-01-28 04:15:20
回答 2查看 1.6K关注 0票数 1

我很难在Swift中正确地返回滚动、俯仰和偏航的语法。加速计都工作得很好,但不能解决这个问题。以下是材料代码:

代码语言:javascript
复制
var roll: Double    = 0.0
var pitch: Double   = 0.0
var yaw: Double     = 0.0    
var manager         = CMMotionManager()

override func viewDidLoad() {
     manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (rpyData: CMDeviceMotionHandler?, NSError) -> Void in self.outputRPY(rpyData!.deviceMotion)
     if(NSError != nil) {
          print("\(NSError)")
     }
   })
}

func outputRPY(data: CMDeviceMotion){
    roll    = data.attitude.roll
    pitch   = data.attitude.pitch
    yaw     = data.attitude.yaw
    rollLabel.text  = String(format: "%.2f°", roll)
    pitchLabel.text = String(format: "%.2f°", pitch)
    rollLabel.text  = String(format: "%.2f°", yaw)
}
EN

回答 2

Stack Overflow用户

发布于 2016-01-28 04:30:39

第二个参数类型应该是NSError?(也称为可选的),在闭包的正文中,您将类型与值进行比较。

总而言之,它应该是这样的:

代码语言:javascript
复制
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (deviceMotion: CMDeviceMotion?, err: NSError?) -> Void in 
    self.outputRPY(deviceMotion!)
    if(err != nil) {
        print("\(err)")
    }
}

您还可以使用可选绑定来更快地...:)

代码语言:javascript
复制
if error = err {
    print("\(error)")
}

编辑

在我家里的机器上测试后,我意识到还有一个问题。CMDeviceMotionHandler声明闭包的类型(或者函数指针,如果您愿意的话)。它被声明为:

代码语言:javascript
复制
public typealias CMDeviceMotionHandler = (CMDeviceMotion?, NSError?) -> Void

因此,您的闭包(或处理程序)应该如下所示:

代码语言:javascript
复制
{ (deviceMotion: CMDeviceMotion?, error: NSError?) -> Void in
    // code goes here
}

最后,您的第二个参数使标识符NSError引用一个变量,而该变量已经是一个类型(这是合法的)。我个人不会这样命名它,因为它很容易与NSError类型混淆。也许您可以将其命名为nserror,这样可以避免与现有类型混淆。

第一个代码片段应该只是复制-粘贴到您的项目中。

票数 1
EN

Stack Overflow用户

发布于 2016-01-29 05:48:16

让我吃惊的是,滚转、俯仰、偏航似乎与加速计、陀螺仪、磁力计的工作方式不同。这是最新的新闻代码:

代码语言:javascript
复制
 var manager         = CMMotionManager()

 override func viewDidLoad() {   
    super.viewDidLoad()
    manager.deviceMotionUpdateInterval  = 0.2
    manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: {(motionData: CMDeviceMotion?, NSError) -> Void in self.outputRPY(motionData!)
        if (NSError != nil){
            print("\(NSError)")
        }
    })
 }

 func outputRPY(data: CMDeviceMotion){
    let rpyattitude = manager.deviceMotion!.attitude
    roll    = rpyattitude.roll * (180.0 / M_PI)
    pitch   = rpyattitude.pitch * (180.0 / M_PI)
    yaw     = rpyattitude.yaw * (180.0 / M_PI)     
    rollLabel.text  = String(format: "%.2f°", roll)
    pitchLabel.text = String(format: "%.2f°", pitch)
    yawLabel.text   = String(format: "%.2f°", yaw)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35047165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档