※本記事は、一般に公開されている情報を元に作成しています
これは何
watchOS 3 で追加された WKCrownSequencer
を使って、デジタルクラウンの状態(回転速度など)を取得する方法をメモします。
動作環境
- Xcode 8.0 beta 1
- watchOS 3.0 beta 1
実装
デジタルクラウンの状態は、 crownSequencer
オブジェクトが保持しています。
WKInterfaceController
のプロパティとして新たに
public var crownSequencer: WKCrownSequencer { get }
が追加されているので、自分でインスタンスを生成する必要はありません。
デリゲートセット
まずは、crownSequencer
のデリゲートをセットしましょう。
class CrownDetailController: WKInterfaceController, WKCrownDelegate {
crownSequencer.delegate = self
この状態ではまだ crownSequencer
にフォーカスが当たっていないため、focus()
メソッドを呼ぶ必要があります。
override func willActivate() {
super.willActivate()
crownSequencer.focus()
}
これでデジタルクラウンの状態変化を受信可能になりました。
デリゲートメソッド
デジタルクラウンの状態が変化すると次のデリゲートメソッドが呼ばれます。
crownDidRotate
ユーザがデジタルクラウンを回転させた時に呼ばれます。
func crownDidRotate(WKCrownSequencer?, rotationalDelta: Double)
rotationalDelta
にはデジタルクラウンの回転数?が返ってくるようです。
The amount that the crown has rotated since the last update. A value of 1.0 represents one full rotation. The value’s sign indicates the rotation’s direction, but the sign is adjusted based on the crown’s orientation. Positive values always indicate an upward scrolling gesture, while negative numbers indicate a downward scrolling gesture.
1.0
が 1回転したことを表し、上方向にスクロールするとプラスの値が、下方向にスクロールするとマイナスの値になるようです。
また、デジタルクラウンの回転速度は、WKCrownSequencer
の rotationsPerSecond
プロパティで確認することもできます。
crownDidBecomeIdle
ユーザがデジタルクラウンの回転を止めた時に呼ばれます。
func crownDidBecomeIdle(WKCrownSequencer?)
また、デジタルクラウンが回転しているかどうかは、WKCrownSequencer
の isIdle
プロパティで確認することもできます。
注意点
InterfaceController 上にスクロール可能なオブジェクトがある場合は少し注意が必要です。例えばWKInterfacePicker
にフォーカスが当たった場合、WKCrownSequencer
のフォーカスは外れます。再びフォーカスを当てるためには再度 focus()
メソッドを呼ぶ必要があります。
リンク
- WatchKit Catalog: Using WatchKit Interface Elements - WKCrownSequencer のサンプルコードも追加されています
- WKCrownSequencer - Apple Developer Documentation
- 【watchOS 3】API Diffsから見る watchOS 3 の新機能 #WWDC2016 - Over&Out その後 - shu223さんによる神記事