はじめに
通常、キーボードの表示/非表示の通知はUIWindowのNSNotificationを使う。
UIKeyboardWillShowNotification
UIKeyboardDidShowNotification
UIKeyboardWillHideNotification
UIKeyboardDidHideNotification
それぞれWill/Didが取れて、これでキーボードに合わせた処理なんかが行えた。しかし、分割キーボード(iPad)だとこれが通用しないようだ。
今回はiOS 7.1でしか検証できていないので、他のOSではまた変わる可能性がある。
各種通知の検証
固定キーボードのとき、分割キーボードのとき、互いを切り替えたときにどのような通知が来るのかを調べた。
操作の度に ChangeNotification が来る
固定→分割、分割→固定、移動、表示、非表示などの操作の度にUIKeyboardWillChangeFrameNotification
UIKeyboardDidChangeFrameNotification
が来る。
userInfoの中身はUIKeyboardFrameEndUserInfoKey
以外は何も無い場合もある。
UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification NS_AVAILABLE_IOS(5_0);
UIKIT_EXTERN NSString *const UIKeyboardDidChangeFrameNotification NS_AVAILABLE_IOS(5_0);
それぞれのuserInfoに含まれる内容を出力してみた:
// 分割キーボード表示時 UIKeyboardWillChangeFrameNotification
{
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 267}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 901.5}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 634.5}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{768, 0}, {267, 1024}}";
UIKeyboardFrameChangedByUserInteraction = 0;
UIKeyboardFrameEndUserInfoKey = "NSRect: {{326, 0}, {267, 1024}}";
}
// 分割キーボード表示時 UIKeyboardDidChangeFrameNotification
{
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 267}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 901.5}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 634.5}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{768, 0}, {267, 1024}}";
UIKeyboardFrameChangedByUserInteraction = 0;
UIKeyboardFrameEndUserInfoKey = "NSRect: {{326, 0}, {267, 1024}}";
}
// 分割キーボード移動時 UIKeyboardDidChangeFrameNotification
{
UIKeyboardFrameEndUserInfoKey = "NSRect: {{245, 0}, {267, 1024}}";
}
// 分割キーボード結合時 UIKeyboardDidChangeFrameNotification
{
UIKeyboardFrameEndUserInfoKey = "NSRect: {{272, 0}, {352, 1024}}";
}
UIKeyboardFrameChangedByUserInteraction の意味が分からない
「ユーザの操作によるフレーム変更通知」のように読み取れるが、どう操作しても常に値は0
であるため、これが何を意味するのかが分からない。文書にも特に記載はないので謎のまま。。
固定→分割のときは HideNotification が来る
固定キーボードを分割キーボードにしたときにはUIKeyboardWillHideNotification
UIKeyboardDidHideNotification
が来る。
分割は「キーボードを隠した」という扱いなのだろうか……?
分割→固定のときは ShowNotification が来る
分割キーボードを固定キーボードにしたときにはUIKeyboardWillShowNotification
UIKeyboardDidShowNotification
が来る。
ShowNotification/HideNotificationとは固定キーボードに関する通知で、分割キーボードはこれに関わらないものに思える。
分割キーボードの表示/非表示の判定
以上の事から、ChangeNotification に含まれるUIKeyboardFrameEndUserInfoKey
あたりを利用して、キーボードが画面内にあれば表示
、否であれば非表示
と判定すれば良いのか?
なんとも面倒くさくて本当にこれで良いのか不安になってしまう。