Google+ もご覧ください
ユーザーアイコン

iOSアプリ開発こぼれ話

iOSアプリで外部キーボードからのショートカットに対応する方法

K katsumi

iOSアプリで外部キーボードからのショートカットに対応する方法

iOS 7のSafariやメールでは外部キーボードを使用した際に利用できるできるショートカットが以前より充実したことが話題になりました

さらにiOS 7ではキーボードショートカットを実装するためのAPIが追加されていますので、サードパーティのアプリケーションもキーボードショートカットに対応することができます。特定のキーボードショートカットに応答するには下記のプロパティを実装します。

@property(nonatomic, readonly) NSArray *keyCommands

このプロパティはUIResponderクラスにreadonlyとして宣言されていますので、UIViewのサブクラスか、UIViewControllerのサブクラスでgetterメソッドをオーバーライドするのがオーソドックスなやり方になります。 なおビューコントローラはデフォルトでFirst Responderになれないので、ビューコントローラに実装する場合はcanBecomeFirstResponderYESを返すのを忘れないようにしましょう。

ここで返す値はUIKeyCommandクラスのインスタンスの配列です。UIKeyCommandクラスはキーの入力の組み合わせを表すクラスでこちらもiOS 7から新たに導入されました。

UIKeyCommandのオブジェクトは専用のクラスメソッドを使用して作成します。

+ (UIKeyCommand *)keyCommandWithInput:(NSString *)input modifierFlags:(UIKeyModifierFlags)modifierFlags action:(SEL)action;

例えばコマンドキー+Sというショートカットに対応するには下記のようにします。

- (NSArray *)keyCommands
{
    return @[[UIKeyCommand keyCommandWithInput:@"s"
                                 modifierFlags:UIKeyModifierCommand
                                        action:@selector(handleCommand:)]];
}

inputパラメータはキー押した時に入力される文字を指定します。modifierFlagsはコマンド(⌘)キーやオプション(⌥)キー、シフトキーなどの修飾キーの組み合わせをビットマスクで指定します。

例えば「コントロールキー+オプションキー+S」というショートカットを表すUIKeyCommandのインスタンスは下記になります。

- (NSArray *)keyCommands
{
    return @[[UIKeyCommand keyCommandWithInput:@"s"
                                 modifierFlags:UIKeyModifierControl | UIKeyModifierAlternate
                                        action:@selector(handleCommand:)]];
}

ここで注意すべきなのはUIKeyModifierControl | UIKeyModifierAlternateという組み合わせで表現されるのはコントロールキーとオプションキーを両方押すという組み合わせであって、コントロールキーまたはオプションキーをどちらか片方だけ押した場合は別のショートカットキーと扱われる点です。

modifierFlagsを指定しなかった場合は単独のキー入力に対応することができます。またエスケープシーケンスを利用して@"\r"@"\t"をキー入力として指定するとEnterキーやタブキーの入力に応答することができます。

キー入力のうち矢印キーとエスケープキーの特別なキーについては専用の定数が用意されています。

UIKIT_EXTERN NSString *const UIKeyInputUpArrow         NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputDownArrow       NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputLeftArrow       NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputRightArrow      NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputEscape          NS_AVAILABLE_IOS(7_0);

これらを組み合わせると、例えば矢印キーでテーブルビューを選択したり、エスケープキーでキャンセル、タブキーで移動など一般のビジネスアプリケーションでよくあるキー操作を実装することができます。

こちらのリポジトリはサンプルコードとしてほぼすべてのキー入力と修飾キーの組み合わせに反応して、押されたキーの組み合わせを画面に表示するプログラムです。参考にしてください。また、その動作した時のスクリーンショットは下記を参考にしてください。なおBluetoothの外部キーボードを持っていなくても、シミュレータのハードウェアキーボードをシミュレートを有効にすると試すことができます。

コマンド+S
コマンド+S

コマンド+オプション+A
コマンド+オプション+A

エンターキー
エンターキー

DELETEキー
DELETEキー


いかがでしょうか。タブレットでは外付けキーボードを使う方が入力が楽になる業務系アプリもあります。そうした層をターゲットにしたアプリでキーボードショートカットを実装すると差別化につながるのではないでしょうか。ぜひ試してみてください。

Ios talk
タグ:

記事をリクエストする

関連記事

コメント