0

意味がないので、誰かに説明してもらう必要があります。

ビューがキーボードの上に積み重ねられているように見えるように計算userInfoを使用して実行することでUIKeyboardsフレームを取得する場合、20ピクセルの違いを作成する必要があります。UIKeyboardFrameEndUserInfoKey

数学:

CGRect frame = view.frame;
CGPoint origin = frame.origin;
origin.x = kbFrame.origin.x;
origin.y = kbFrame.origin.y - view.frame.size.height - 20;
frame.origin = origin;
view.frame = frame;

ステータスバーに違いないと思いましたが、これがキッカーです。Retinaディスプレイで開発しているので、ステータスバーの高さは20ではなく40ピクセルです。

次に、ビューからビューへの変換を追加しました

CGRect kbFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

UIWindow * window = [UIApplication sharedApplication].windows[0];

kbFrame = [self.view convertRect:kbFrame fromView:window];

そしてそれはそれを修正したようです。つまり、20ピクセルの違いを取り除くことができます。

本当に私を驚かせるのは、を使用しているときですUIKeyboardFrameBeginUserInfoKey。キーボードのフレームは画面の下部にあります。これは正しいですが、終了フレームにより、20ピクセルの違いがエンコードされます。変換コードを追加すると、キーボードが20ピクセル上に表示されるため、違いがなくなります。一体何が起こっているのですか?

4

1 に答える 1

1

あなたが説明しているのは、自然で望まれる行動です。
重要なのは、キーボード座標がウィンドウ座標系にあるということです。
ビューがウィンドウ座標系にない可能性があります。したがって、正しく使用できるようにするには、常に座標系間の変換を行う必要があります。

UIKeyboardFrameBeginUserInfoKeyを使用すると、キーボードのフレームが画面の下部に表示されます。これは正しいですが、

私は同意しません、あなたはおそらくあなたが思っているよりも20ポイント低いです(あなたがそれをあなたのビュー座標系で設定しているなら)、しかしそれは画面から外れているのであなたはオフセットに気づきません。

すべてのビューには、その境界内にある独自の座標系があります。また、ビューのフレームは、その親座標系で表現されます。この違いの理由と必要性を理解していないと、混乱を招く可能性もあります。

これがお役に立てば幸いです。

Retinaディスプレイと測定に関する注意:
iOSでは、コード内でPixelを処理することはありません(アセットを準備する場合のみ)。常にPointを処理します。したがって、ステータスバーは、Retinaであるかどうかに関係なく、常に20ポイントです。

于 2012-11-24T19:26:33.953 に答える