iOS シミュレーターが勝手にスローモーションになるのを防ぐ
SPECIAL
iOS シミュレーターが勝手にスローモーションモードになる原因
勝手にスローモーション
iPhone アプリを作っているのですけど、Mac OS X を Windows からのリモート操作ではなく直接操作するようにしたら、快適になるはずが、思いがけずに制作に支障がでてきました。
というのも、iOS シミュレーターを使ってテストする度に、スローアニメーションモードの ON/OFF が切り替わってしまって、大抵の場合、毎回スローアニメーションモードを解除をしないといけなくなってしまったのでした。
ちなみにスローアニメーションモードが切り替わったとき、Xcode のコンソールログには次のようなメッセージが表示されます。
Simulator slow-motion animations are now on
原因は Microsoft キーボードドライバとの相性でした。
その原因については iPhone シミュレータがスローモーションになってしまう原因 で原因を追究していて、結局のところ、まさかの Microsoft 社のキーボードと、それを Mac で使うときに入れる IntelliType キーボードドライバが原因だったわけなのですけれど。
原因が判れば解決もきっと…と思ったんですけど、キーボードドライバを削除するとキー配列がおかしくなってしまうし、IntelliType のカスタマイズで iOS Simulator では無効に設定しても解消されず、簡単には対応できない雲行きでした。
ちなみに根本的な原因は、iOS シミュレーターにフォーカスを当てたときに Shift キーが連打されたことになってしまうことでした。
Xcode 4 の iOS シミュレーターは Shift キー 3 回でスローアニメーションモードの ON/OFF が切り替わるようになっているため、その影響をもろに受けてしまった感じですね。
キーリマッパー
そんな中、自分でキーの配置を細かくできるキーリマッパーというジャンルのソフトがあることを知りました。
いちおう Microsoft IntelliType もキーリマッパーの一種なのですけれど、このキーボードドライバの場合は Shift キーを別のキーに置き換えたりが出来ないため、勝手に送信される Shift キーを別の何かに置き換えることができません。
iOS シミュレーターへの Shift キー送信を無効化できたら、それでひとまず今回は一件落着なところです。
KeyRemap4MacBook を使って回避する
KeyRemap4MacBook - Key Remapper
それからしばらく Shift キーを無効化できるキーリマッパーないかなってちょっと探してみていました。ただ Shift キーは普段でも良く使うキーなので、iOS シミュレーター限定で制限できることが大前提です。
そんな条件でキーリマッパーを探していると、その理想に合いそうなキーリマッパーが見つかりました。
KeyRemap4MacBook - OS X用のソフトウェア
このKeyRemap4MacBookは高機能でとても人気の高いソフトみたいで、"4MacBook" という名前がついてますけど、別に MacBook 専用のソフトではなくて Mac mini でも普通に使えます。
今回の場面でもこれはかなり期待できそうなので、さっそくインストールさせて頂くことにしました。
KeyRemap4MacBook のインストール
インストールは簡単で、普通の Mac ソフトウェア通りにdmgファイルをダウンロードしてマウントしたら、pkgファイルを実行してインストールを進めるだけです。
KeyRemap4MacBook のリマップ設定方法
KeyRemap4MacBook のインストールが終わったら、iOS シミュレーターに Shift キーを送信しないためのリマップ設定を行います。
KeyRemap4MacBook を起動して "Misc & Uninstall" タブを選択します。
そしてここの "Open private.xml" ボタンをクリックして "private.xml" ファイルを開きます。
そこに、テキストエディタを使ってキーリマップの設定を書き込んで行きます。
設定できるキーリマップは KeyRemap4MacBook - OS X用のソフトウェア で細かく説明されています。駆使するのは難しそうですけど、これを上手に使えればかなりのことが出来そうですね。
private.xml に書き込んだら "Change Key" タブでそれを有効化します。
書き換えたら "ReloadXML" ボタンで新設定を取り込んで、"remapping" リストに挙がってきたらその項目のチェックを入れたり外したりして、設定を個別に有効化したり無効化できます。
チェックの ON/OFF を入れ替えるだけで、再起動とかはする必要はなさそうでした。
iOS シミュレーター限定の設定が出来るようにする
今回は iOS シミュレーターに限って設定を調整したいところなので、まずは対象アプリケーションを限定するのに必要な設定からやってみます。
<appdef>
<appname>IOSSIMULATOR</appname>
<equal>com.apple.iphonesimulator</equal>
</appdef>
アプリを限定したいときには <appdef> を使って定義する必要があります。
iOS シミュレーターの ID は "com.apple.iphonesimulator" なので、これに自由に名前を付けておきます。今回の場合は "IOSSIMULATOR" というのが、自分で付けた名前です。
この名前をキーマップ設定のときに <only> タグで指定することで、その設定をこの ID のアプリケーションでしか有効にしないように制限できます。
iOS シミュレーターに Shift を送信しないように設定する
それでは、iOS シミュレーターに Shift キーが送信されないようにしてみます。
<item>
<name>Disable Shift Key (iOS Shimulator)</name>
<identifier>private.iossimulator.disableshift</identifier>
<only>IOSSIMULATOR</only>
<autogen>
__KeyToPointingButton__
KeyCode::SHIFT_L,
PointingButton::NONE
</autogen>
</item>
<name> でこの設定の表示名を付けて、<identifier> では KeyRemap4MacBook で使う管理名を付けてあげます。
そして <only> でこの設定を IOSSIMULATOR に限定し、<autogen> でキーリマップを定義しています。
キーリマップ設定は "__KeyToPointingButton__" で、あるキーが押されたときにマウスのボタンが押されたことにするという設定をしていることになる、と思います。
今回の例では左シフトキー (KeyCode::SHIFT_L)をマウスのボタンが押されていない状態 (PointingButton::NONE)に置き換えることで、シフトキーを無効化しています。
この設定を有効にすることで、フォーカスを移動した時に Shift キーが連打で送られることがなくなって、勝手にスローアニメーションモードの状態が変わることはなくなります。
ただ、シフトキーが利かなくなるので、キーボードから直接 iOS シミュレーターに入力したいようなときには不都合があるかもしれません。
そんなときでも KeyRemap4MacBook ならチェックひとつで直ぐに無効化することもできるので、直ぐに対応できるところが嬉しいですね。
Home キーをホームボタンとして使う
ついでに iOS シミュレーターでは "Command +Shift + H" で iOS のホームボタンをエミュレートする機能が付いてますけど、Microsoft Natural Ergonomic キーボードにはせっかく "Home" キーが付いているので、これをそのまま iOS のホームボタンとして使えるようにしてみます。
<item>
<name>Home Key (iOS Shimulator)</name>
<identifier>private.iossimulator.home</identifier>
<only>IOSSIMULATOR</only>
<autogen>
__KeyToKey__
KeyCode::HOME,
KeyCode::H, ModifierFlag::COMMAND_R | ModifierFlag::SHIFT_R
</autogen>
</item>
今回の <autogen> で使っている "__KeyToKey__" は、あるキーが押されたときにそれを別のキーに変換する設定です。
ここでは "Home" キーが押されたら、iOS シミュレーターには "Command + Shift + H" を送るようにしています。
これを有効にしておけば、iOS シミュレーター上で "Home" キーをひとつ押すだけで、ホームボタンとして働いてくれてとっても便利です。