Force Touch や Digital Crown など、Apple Watch によってもたらされる新しいユーザー インタラクションの可能性に非常に興奮しています。
ただし、WatchKit API でそれらについての言及を見つけることができませんでした。Force Touch / Digital Crown からイベントを受け取る方法はありますか? イベントのカスタム ハンドラーを持つことは可能ですか?
Force Touch や Digital Crown など、Apple Watch によってもたらされる新しいユーザー インタラクションの可能性に非常に興奮しています。
ただし、WatchKit API でそれらについての言及を見つけることができませんでした。Force Touch / Digital Crown からイベントを受け取る方法はありますか? イベントのカスタム ハンドラーを持つことは可能ですか?
watchOS 3 ではWKCrownSequencer
、WKCrownDelegate
デジタル クラウンの状態 (回転速度など) を報告したり、ユーザーがクラウンを回転させたときに通知を受け取ったりするために と が追加されています。
クラウン シーケンサーを使用して、シーンまたはインターフェイス オブジェクトを制御するための一般的な入力を提供できます。
Apple は、WatchKit カタログのサンプル コードを更新して、Apple Watch デジタル クラウンを使用して他のオブジェクトとやり取りする方法を示す WKInterfaceController クラウン シーケンサーの例を含めました。
class CrownDetailController: WKInterfaceController, WKCrownDelegate {
@IBOutlet var velocityLabel: WKInterfaceLabel!
@IBOutlet var stateLabel: WKInterfaceLabel!
@IBOutlet var pickerView: WKInterfacePicker!
override func awake(withContext context: AnyObject?) {
super.awake(withContext: context)
let itemList: [(String, String)] = [
("Item 1", "Red"),
("Item 2", "Green"),
("Item 3", "Blue")
]
let pickerItems: [WKPickerItem] = itemList.map {
let pickerItem = WKPickerItem()
pickerItem.caption = $0.0
pickerItem.title = $0.1
return pickerItem
}
pickerView.setItems(pickerItems)
crownSequencer.delegate = self
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
crownSequencer.focus()
}
@IBAction func focusCrown(sender: AnyObject) {
crownSequencer.focus()
}
func updateCrownLabels() {
velocityLabel.setText(String(format: "RPS: %2.2lf", crownSequencer.rotationsPerSecond))
stateLabel.setText(crownSequencer.isIdle ? "Idle: true" : "Idle: false")
}
func crownDidBecomeIdle(_ crownSequencer: WKCrownSequencer?) {
updateCrownLabels()
}
func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double) {
updateCrownLabels()
}
}
現在 (Xcode 6.2 ベータ 3) Apple は、Digital Crown がサードパーティのアプリでページ コンテンツを上下にスクロールすることを示していますが、アプリは Digital Crown からの通知を受信したり、入力デバイスとして使用したりするために登録することはできません。これは、サード パーティのコードが iPhone の WatchKit アプリ拡張機能でのみ実行されていることを考えると、遅延が原因で応答が遅くなったり、バッテリ寿命が長引いたりすることが原因である可能性が高いと思われます。したがって、これらのイベントはワイヤレスで送信する必要があります。電話にストリーミングします。
サードパーティ製アプリでの入力方法として、Force Touch を使用することができます。現時点で、Apple がどのアプリケーションでもフォース タッチを推奨している唯一の用途は、コンテキスト メニューを表示することであり、サード パーティの開発者はこれに完全にアクセスできると考えています。フォース タッチ イベントを受信するために登録する必要はありません。Interface Builder でメニューを作成し、それにメニュー項目を追加して、それらのメニュー項目を WatchKit 拡張機能の IBActions に接続するだけです。メニューをフォース タッチ ジェスチャ レコグナイザーと同等のものに接続する必要がないのはかなり奇妙ですが、試してみると、それが機能することがわかります。2015 年後半に Watch 用のネイティブ アプリを作成できるようになった後でも、サード パーティの開発者が強制的にアクセスする必要があるのは、これだけであり続ける可能性があります。
ただし、Apple は開発者にhttp://bugreporter.apple.comで拡張要求を送信することを推奨しているので、そうすることをお勧めします。また、私たちの多くが既に持っているように、これらの API へのアクセスを要求してください。
現時点では、どちらの入力方法でもカスタム イベント ハンドラを使用することはできません。開発者フォーラムの Apple 従業員は、機能要求を送信することを提案しています。来年、ネイティブの Apple Watch アプリの作成を開始できるようになるとすぐに、Digital Crown API にアクセスできるようになると思います。現時点では、データ入力の重大な制限のままです。
WKInterfacePicker
watchOS 2 (Xcode 7 ベータ版に含まれる) では、デリゲートを登録し、デジタル クラウンの変更に対応できるようにするために、Apple が追加しました。ここでドキュメントを確認できます。
WatchOS 2 では、デジタル クラウンを使用して WKInterfacePicker でアイテムを選択します。
Watch アプリの拡張機能 InterfaceController.h で
@property (strong, nonatomic) IBOutlet WKInterfacePicker *TestSelector;
@property (strong, nonatomic) NSArray *TestsArray;
Watch アプリの拡張機能 InterfaceController.m で
// Setup two items the user can select from in picker
WKPickerItem *pickerItem1 = [WKPickerItem alloc];
[pickerItem1 setTitle:@"First item in list"];
WKPickerItem *pickerItem2 = [WKPickerItem alloc];
[pickerItem2 setTitle:@"Second item in list"];
// Add items to array that will be used to set picker list
self.TestsArray = [[NSArray alloc ] initWithObjects:pickerItem1,pickerItem2, nil];
// Set list of items as choices in the picker list
[TestSelector setItems:self.TestsArray];
インターフェイス ビルダーで、ピッカー UI 要素をリファレンス アウトレットとして TestSelector にリンクします。