3

私は iOS SDK に比較的慣れていません。作業中のアプリのデバイス キーボードの位置と方向に関して、非常に奇妙な問題が発生しています。問題は、ユーザーがマルチタスクを行っている間、またはアプリがバックグラウンドに移行しているときにキーボードが開いている場合、ユーザーがアプリに戻った後、キーボードがずれて (UIKeyboardWillChangeFrameNotification持ち上げられて)、向きと場所が正しくないことです。 .

キーボードが完全に画面外に表示されることもありますが、これはまったく望ましくない動作です。

私の質問は次のとおりです。

  1. キーボードの位置と向きは何に依存していますか? iOS によってどのように制御されますか?

  2. デバイスの種類や画面サイズに関係なく、キーボードが画面外に表示されていることを検出する方法はありますか? UIKeyboardWillChangeFrameNotification追跡や発送で可能だと思いUIKeyboardWillShowNotificationます。

  3. キーボードを表示する前に、キーボードの位置と向きをリセット/設定するにはどうすればよいですか? これは可能ですか?

4

2 に答える 2

5

ドキュメントから:

「キーボード通知のユーザー情報キー」で説明されているキーを使用して、userInfo ディクショナリからキーボードの位置とサイズを取得します。

キーボード通知のユーザー情報辞書から値を取得するために使用されるキー:

NSString * const UIKeyboardFrameBeginUserInfoKey;
NSString * const UIKeyboardFrameEndUserInfoKey;
NSString * const UIKeyboardAnimationDurationUserInfoKey;
NSString * const UIKeyboardAnimationCurveUserInfoKey;
于 2012-10-12T07:47:28.057 に答える
1

1.) キーボードは UIWindow であり、位置はアプリケーションのメイン ウィンドウに依存します。

2.) できることは、通知UIKeyboardWillShowNotification またはUIKeyboardWillChangeFrameNotificationメソッドの実行のいずれかで、Windows サブビューをループしてキーボードを見つけることです。私のアプリケーションの 1 つで、キーボードにサブビューを追加する必要がありました。あなたの場合、これを行うことでフレームを取得できます:

//The UIWindow that contains the keyboard view - It some situations it will be better to actually
//iterate through each window to figure out where the keyboard is, but In my applications case
//I know that the second window has the keyboard so I just reference it directly
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];

//Because we cant get access to the UIPeripheral throught the SDK we will just use UIView.
//UIPeripheral is a subclass of UIView anyways
UIView* keyboard;

    //Iterate though each view inside of the selected Window
for(int i = 0; i < [tempWindow.subviews count]; i++)
{
    //Get a reference of the current view
    keyboard = [tempWindow.subviews objectAtIndex:i];

           //Assuming this is for 4.0+, In 3.0 you would use "<UIKeyboard"
           if([[keyboard description] hasPrefix:@"<UIPeripheral"] == YES) {

                  //Keyboard is now a UIView reference to the UIPeripheral we want
                  NSLog(@"Keyboard Frame: %@",NSStringFromCGRect(keyboard.frame));

           }
}

3.) これが可能かどうかは完全にはわかりませんが、私が提供したコードを使用してください。keyboard独自の変換を適用できる「UIView」にキャストされるようになりました。

これはmostエレガントな解決策ではないかもしれませんが、私の場合はうまくいきます。

お役に立てれば !

于 2012-06-09T02:09:19.127 に答える