Итак, начиная с watchOS 3.0, теперь вы можете получить вращение цифровой короны. Мне удалось использовать функцию crownDidRotate в интерфейсном контроллере. Но я не могу получить вращение короны внутри класса SKScene. Может ли кто-нибудь помочь мне с этим, я сейчас совсем потерялся? Спасибо.
watchOS 3.0 обнаруживает вращение заводной головки в SpriteKit
Ответы (2)
Чтобы получить эти вызовы crownDidRotate
в контроллере интерфейса, вам нужно было принять протокол WKCrownDelegate
в контроллере интерфейса и установить ваш контроллер интерфейса в качестве delegate
его crownSequencer
.
Чтобы получить crownDidRotate
вызовов в другом классе, примите протокол WKCrownDelegate
в этом классе и установите экземпляр этого класса. как delegate
контроллера интерфейса crownSequencer
.
Предположительно, у вас уже есть подобный код для настройки сцены 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"))
}
}
Если вы объявили соответствие WKCrownDelegate
в своем классе MyScene
, просто добавьте строку, чтобы установить его в качестве делегата секвенсор короны контроллера интерфейса:
let scene = MyScene(fileNamed: "MyScene")
spriteGizmo.presentScene(MyScene(fileNamed: "MyScene"))
crownSequencer.delegate = scene
(В качестве альтернативы вы можете установить сцену WKInterfaceSKScene
в раскадровке. В этом случае вы все равно можете ссылаться на WKInterfaceSKScene
из контроллера интерфейса с помощью IBOutlet
. Затем в awake(withContext:)
вы можете получить доступ к сцене через этот выход и установить ее в качестве делегата короны. .)
В watchOS 3 любой объектный объект может получать события цифровой короны, установив их в качестве делегата:
let crownSequencer = WKExtension.shared().rootInterfaceController!.crownSequencer
crownSequencer.delegate = self
crownSequencer.focus()
Затем прочитайте значение, реализуя:
func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double)
Важно вызывать focus()
, особенно для контроллеров, пользовательский интерфейс которых подходит для экрана и не требует фактической прокрутки.