LoginSignup
4
4

More than 5 years have passed since last update.

分割キーボードの通知がよく分からない件

Last updated at Posted at 2014-08-26

はじめに

通常、キーボードの表示/非表示の通知は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あたりを利用して、キーボードが画面内にあれば表示、否であれば非表示と判定すれば良いのか?

なんとも面倒くさくて本当にこれで良いのか不安になってしまう。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4