2012年7月17日火曜日

UIKeyboardTypeDecimalPadの注意点

iOSのキーボードの種類UIKeyboardTypeにある UIKeyboardTypeDecimalPad。

このキーボードは、iOS4.1以上から使用できますが、iOS4.3.5の実機で試すと表示できない場合があるようです。
表示できない場合というのは、
対象画面表示直前に表示したキーボードが、
QWERTYキーボードであれば、DecimalPadになりますが
フリック入力(Japanese Keyboard)の場合、NumberPad(ピリオドなし)
になってしまいます。
iOS5ではこの現象は発生しないので、多分バグかなと。

QWERTYキーボードなのか、 フリック入力キーボードなのか の判別方法は見つけられず....
そうなると、iOS4.X以下の場合には、NumberPad を表示するようにして、ピリオドを自分で追加する感じにしてあげないといけなさそう。

ピリオドのボタンはどこに表示するか? ですが、
Keyboardの一番左下のボタンに乗せてDecimalPadのように見せるには、どのViewに載せるかが微妙。
Keyboardって、AppDelegateで渡ってくるWindowではなくて、UITextEffectsWindow っていう違うWindowで表示されているみたい。
NSArray *allWindows = [[UIApplication sharedApplication] windows];
のwindowsから取ってこれるが、あんまりやりたくない感じではあります。
参考 : How to add your own Done button to the iPhone numeric keypad

キーボードを入れ替えするのであれば、UITextField#inputView
キーボードの上部に載せるのであれば、UITextField#inputAccessoryView
のViewを入れ替えればいけそう。
こちらは、正式リファレンスにもあるので安心して使えますが、自分でデザイン、動作する必要はあります。

もう一つ、忘れがちなのが国際化対応アプリならば、小数点区切り が ドイツ、フランスでは ,(カンマ)であること。
.(ピリオド)固定でボタンを作らないように注意です。
NSString *decimalSeparator = [[NSLocale currentLocale] objectForKey:NSLocaleDecimalSeparator];
これで区切り文字がとれます。

さらにもうひとつ。
Keyboardをタップする時に音が出るのが標準になっていると思うので、自作して追加したボタンタップ時にも音を出すのが自然。
iOSが出している音と同じものを出したくなりますが、どうやら正式なリファレンスには載っていないぽい?
AudioServices に、predefined system soundsの一覧が載っていますが... 正式リファレンスではないのでリジェクトされるかもしれないし、勝手に消えたり、変更されたりするだろうし... というのは自己責任で。
ちなみに、Keyboardタップ音は、
AudioServicesPlaySystemSound(1104);
ぽいです。

早く、iOS5以上の対応で問題ないぐらいまで、iOS4が消えて欲しいですw

• • •