Apple ドキュメントキーボードの下にあるコンテンツの移動にあるコードについて質問があります。私はこれを調査しましたが、代替ソリューションに夢中になる前に、ここで曖昧な概念を明確にすることを探しています。
残念ながら、キーボード アニメーションがキーボードを上に移動し終えるとすぐに、ビューは下に移動し、完全にサイトから外れます。これは、テキスト フィールドが実際にキーボードで覆われているかどうかに関係なく発生します。そのため、ドキュメントで提供されているコードを理解しようとして戻ってきましたが、さまざまなパラメーターを変更しようとした後、正しく動作させることができませんでした。
Apple が提供する関連コードは次のとおりです。
- (void)keyboardWasShown:(NSNotification*)aNotification
NSLog(@"keyboardWasShown");
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your application might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
NSLog(@"if");
CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
NSLog(@"scrollPoint is %@", NSStringFromCGPoint(scrollPoint));
[scrollView setContentOffset:scrollPoint animated:YES];
まず第一に、以下で説明するように何かを変更する前に、次の結果が得られます。
GO[4614:c07] keyboardWasShown
2012-09-08 22:58:23.892 DRO GO[4614:c07] if
2012-09-08 22:58:23.892 DRO GO[4614:c07] scrollPoint is {0, -281}
だから、それを分解する:
メソッドが呼び出されたことを示す NSLog だけの情報
NSDictionary - さまざまなデバイスまたは向きのさまざまなキーボード サイズが自動的に考慮されるように、寸法を含むキーボードに関する情報が含まれています。
CGSize - 辞書から実際のサイズを取得する
UIEdgeInsets - UIKit Function Reference の参照 - ボタンまたはビューのエッジ インセットを作成します。インセットは、各辺 (左、右、上、下) が異なる値を持つことができる描画四角形の周囲のマージンです。この場合、下端をキーボードの高さに設定します。私のビューは上ではなく下に移動しているので、「上」と「下」の値を逆にしてみました。ビューがアニメーションでスムーズに下にスクロールする代わりに、キーボードがポップアップしたときに見えなくなるだけで、次のようになります。
GO[4829:c07] 2012-09-08 23:06:57.146 DRO GO[4829:c07] scrollPoint が {0, -281} の場合
scrollView.contentInset: 囲んでいるスクロール ビューからコンテンツ ビューが挿入される距離。このプロパティを使用して、コンテンツの周りのスクロール領域に追加します。サイズの単位はポイントです。デフォルト値は UIEdgeInsetsZero です。スクロール ビューの下部に領域を追加して、キーボードと一緒に上に移動できるようにする必要があるようです。
scrollView.scrollIndicatorInset - キーボードに反応してビューの動きに比例して動くようにスクロール インジケーターに指示する
CGRect - ビューの寸法で aRect オブジェクトを作成します。
aRect - CGRect の高さの値で、キーボードの高さ分減少します。私はここで非常にあいまいです - キーボードで覆われていないビューの領域でなければなりません。
if - CGpoint が (アクティブなテキスト フィールド内のポイントで、キーボードの下にある四角形内に) ない場合 - これは意味がありません。ここの論理は私を逃れる
NSLog - ここまで来たことを教えてくれます
CGScrollPoint - ビューがスクロールするポイントを定義します。ビューの原点は左上隅であるため、キーボードの高さを差し引くと、テキストフィールドを表示したまま、キーボードの高さの距離だけ上にスクロールする必要があります。キックのために、 +kbSizeHeight に変更しようとすると、ビューがすばやく消えてしまいました。 }
NSLog - ビューを移動するスクロール ポイントを教えてくれる
[scrollView - アニメーションを使用して新しい scrollPoing に調整するように scrollView に指示する