class UIHoverGestureRecognizer
概要
Mac CatalystでビルドしたiOSアプリとMacアプリでは、システムはアクティブなアプリのレスポンダチェーンでプレスイベントをレスポンダオブジェクトに送信し、ユーザーが物理キーボードで行ったキープレスを報告します。
レスポンダチェーンはUIResponder
オブジェクト(UIViewControllerやUIApplication
など)が連なったものです。UIResponderオブジェクトは、イベントを処理するか、イベント処理をアプリ内の別のレスポンダに委任します。レスポンダおよびレスポンダチェーンについての詳細は、「レスポンダおよびレスポンダチェーンを使用したイベントの処理」を参照してください。
キープレスの検出
ユーザーが物理キーボードで行ったキープレスを検出するには、アプリデリゲートやメインビューコントローラなど、アプリのレスポンダオブジェクトでpressesBegan(_:with:)
を上書きします。
ユーザーがどのキーを押したか判断するには、各プレスのkey
プロパティを調べて、プレスのセットを順に反復処理します。charactersIgnoringModifiers
を使用して、キーのテキスト値を判断し、レスポンダがキープレスを処理すべきかどうか判断します。レスポンダがキープレスを処理しない場合は、スーパークラスでpressesBegan(_:with:)
を呼び出して、アクティブなレスポンダチェーンの次のレスポンダにプレスイベントを送信します。
たとえば、次のコードリストでは、ユーザーが左右の矢印キーを押すと、ゲームのキャラクターが前後に走ります。
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
// Run backward or forward when the user presses a left or right arrow key.
var didHandleEvent = false
for press in presses {
guard let key = press.key else { continue }
if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow {
runBackward()
didHandleEvent = true
}
if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow {
runForward()
didHandleEvent = true
}
}
if didHandleEvent == false {
// Didn't handle this key press, so pass the event to the next responder.
super.pressesBegan(presses, with: event)
}
}
キーリリースの検出
ユーザーがキーをリリースした時に検出するには、レスポンダのpressesEnded(_:with:)
メソッドを上書きします。キーに関する情報を入手するには、キープレスを検出する場合と同じように、presses
セットの各プレスのkey
プロパティを調べます。たとえば、次のコードリストでは、ユーザーが左または右矢印キーを放すと、キャラクターが特定の向きに走るのをやめます。
override func pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
// Stop running when the user releases the left or right arrow key.
var didHandleEvent = false
for press in presses {
guard let key = press.key else { continue }
if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow {
stopRunningBackward()
didHandleEvent = true
}
if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow {
stopRunningForward()
didHandleEvent = true
}
}
if didHandleEvent == false {
// Didn't handle this key press, so pass the event to the next responder.
super.pressesBegan(presses, with: event)
}
}