如何以swift语言在watchKit中为gyroActive或gyroAvailable编码?

Posted

技术标签:

【中文标题】如何以swift语言在watchKit中为gyroActive或gyroAvailable编码?【英文标题】:how to code for gyroActive or gyroAvailable in watchKit in swift language? 【发布时间】:2015-10-26 06:37:59 【问题描述】:

我已经阅读了下面关于 gyroAvailable 在 watchKit 中的 swift 语言文章。

https://developer.apple.com/library/watchos/documentation/CoreMotion/Reference/CMMotionManager_Class/index.html#//apple_ref/occ/instp/CMMotionManager/gyroActive

但我不知道如何编写代码以及在哪里编写(哪个文件)?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以将陀螺仪代码添加到手表扩展中的任何类中,但您可能希望将其添加到 WKInterfaceController 的子类中

这里希望实现可能如下所示:

import WatchKit
import CoreMotion    

class GyroInterfaceController: WKInterfaceController 

        let motionManager = CMMotionManager()

        override func awakeWithContext(context: AnyObject?) 
            super.awakeWithContext(context)
            motionManager.gyroUpdateInterval = 0.1
        

        override func willActivate() 
            super.willActivate()

            if (motionManager.gyroAvailable == true) 
                motionManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler:  (data, error) -> Void in
                    guard let data = data else  return 
                    let rotationX = data.rotationRate.x
                    let rotationY = data.rotationRate.y
                    let rotationZ = data.rotationRate.z
                    // do you want to want to do with the data
                )
             else 
                print("Gyro not available")
            
        

        override func didDeactivate() 
            super.didDeactivate()
            motionManager.stopGyroUpdates()
        
    

理论上这应该可行。如果您尝试一下,您会看到它只会打印(“陀螺仪不可用”)。陀螺仪数据似乎还无法访问。让我们希望 Apple 能够在不久的将来实现它。

与此同时,您至少可以使用加速度计中的数据。那是可以访问的。代码看起来很相似:

import WatchKit
import CoreMotion

class AccelerometerInterfaceController: WKInterfaceController 

    let motionManager = CMMotionManager()

    override func awakeWithContext(context: AnyObject?) 
        super.awakeWithContext(context)
        motionManager.accelerometerUpdateInterval = 0.1
    

    override func willActivate() 
        super.willActivate()

        if (motionManager.accelerometerAvailable == true) 
            motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler:  (data, error) -> Void in
                guard let data = data else  return 
                let accelerationX = data.acceleration.x
                let accelerationY = data.acceleration.y
                let accelerationZ = data.acceleration.z
                // do you want to want to do with the data
            )
        
    

    override func didDeactivate() 
        super.didDeactivate()
        motionManager.stopAccelerometerUpdates()
    

当然,这只适用于 Apple Watch,不适用于模拟器。

【讨论】:

谢谢你.....回复很有帮助......我能够从加速度计获得原始数据,但正如你所说,不是来自陀螺仪......【参考方案2】:

我试过这个并寻找一些时间来寻找答案,解决方案将是使用 MotionUpdates。

motionManager.startDeviceMotionUpdates(to: OperationQueue.current!)  (data, error) in
            guard error == nil else  return 
            guard let allData = data else  return 
print(allData)// it will return all -> ACC, Gyro,...

【讨论】:

以上是关于如何以swift语言在watchKit中为gyroActive或gyroAvailable编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WatchKit 中为模式界面设置导航标题的色调颜色?

在Swift中使用WatchKit通过程序设置UIImage动画

Swift - WatchKit:如何将数据返回到根视图控制器?

有没有办法让我的 WatchKit 应用程序在后台运行?

在我的 WatchKit 扩展中引用一个 Objective c 类(swift)

如何在不制作 IBOutlet 的情况下以编程方式在 Swift 中为 UIView 高度约束设置动画?