watchOS 3.0 检测 SpriteKit 中的表冠旋转

watchOS 3.0 detect crown rotation in SpriteKit

从 watchOS 3.0 开始,您现在可以获取数字表冠的旋转。我设法在 InterfaceController 中使用 crownDidRotate 函数。 但是我无法从 SKScene Class 中获取表冠的旋转。 谁能帮我解决这个问题,我现在迷路了? 谢谢

要在您的界面控制器中获得那些 crownDidRotate 调用,您必须采用其 crownSequencerWKCrownDelegate protocol in your interface controller, and set your interface controller as the delegate

要在其他 class 中获得 crownDidRotate 调用,请采用您的界面控制器 crownSequencerWKCrownDelegate protocol in that class, and set an instance of that class as the delegate

想必您已经有了这样的代码来设置您的 SpriteKit 场景:

class InterfaceController: WKInterfaceController {

    @IBOutlet var spriteGizmo: WKInterfaceSKScene!

    override func awake(withContext context: AnyObject?) {
        super.awake(withContext: context)

        let scene = MyScene(fileNamed: "MyScene")
        spriteGizmo.presentScene(MyScene(fileNamed: "MyScene"))
    }
}

如果你在你的MySceneclass中声明了WKCrownDelegate一致性,只需添加一行将其设置为界面控制器皇冠音序器的委托:

let scene = MyScene(fileNamed: "MyScene")
spriteGizmo.presentScene(MyScene(fileNamed: "MyScene"))
crownSequencer.delegate = scene

(或者,您可以在 Storyboard 中设置 WKInterfaceSKScene 的场景。在这种情况下,您仍然可以使用 IBOutlet 从界面控制器中引用 WKInterfaceSKScene。然后在awake(withContext:)中,可以通过那个outlet访问场景,设置为皇冠代表。)

在 watchOS 3 中,任何对象都可以通过将它们设置为委托来获取数字表冠事件:

let crownSequencer = WKExtension.shared().rootInterfaceController!.crownSequencer
crownSequencer.delegate = self
crownSequencer.focus()

然后通过执行读回值:

func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double)

调用 focus() 很重要,特别是对于 UI 适合屏幕且不需要实际滚动的控制器。