1

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}

だから、それを分解する:

  1. メソッドが呼び出されたことを示す NSLog だけの情報

  2. NSDictionary - さまざまなデバイスまたは向きのさまざまなキーボード サイズが自動的に考慮されるように、寸法を含むキーボードに関する情報が含まれています。

  3. CGSize - 辞書から実際のサイズを取得する

  4. UIEdgeInsets - UIKit Function Reference の参照 - ボタンまたはビューのエッジ インセットを作成します。インセットは、各辺 (左、右、上、下) が異なる値を持つことができる描画四角形の周囲のマージンです。この場合、下端をキーボードの高さに設定します。私のビューは上ではなく下に移動しているので、「上」と「下」の値を逆にしてみました。ビューがアニメーションでスムーズに下にスクロールする代わりに、キーボードがポップアップしたときに見えなくなるだけで、次のようになります。

    GO[4829:c07] 2012-09-08 23:06:57.146 DRO GO[4829:c07] scrollPoint が {0, -281} の場合

  5. scrollView.contentInset: 囲んでいるスクロール ビューからコンテンツ ビューが挿入される距離。このプロパティを使用して、コンテンツの周りのスクロール領域に追加します。サイズの単位はポイントです。デフォルト値は UIEdgeInsetsZero です。スクロール ビューの下部に領域を追加して、キーボードと一緒に上に移動できるようにする必要があるようです。

  6. scrollView.scrollIndicatorInset - キーボードに反応してビューの動きに比例して動くようにスクロール インジケーターに指示する

  7. CGRect - ビューの寸法で aRect オブジェクトを作成します。

  8. aRect - CGRect の高さの値で、キーボードの高さ分減少します。私はここで非常にあいまいです - キーボードで覆われていないビューの領域でなければなりません。

  9. if - CGpoint が (アクティブなテキスト フィールド内のポイントで、キーボードの下にある四角形内に) ない場合 - これは意味がありません。ここの論理は私を逃れる

  10. NSLog - ここまで来たことを教えてくれます

  11. CGScrollPoint - ビューがスクロールするポイントを定義します。ビューの原点は左上隅であるため、キーボードの高さを差し引くと、テキストフィールドを表示したまま、キーボードの高さの距離だけ上にスクロールする必要があります。キックのために、 +kbSizeHeight に変更しようとすると、ビューがすばやく消えてしまいました。 }

  12. NSLog - ビューを移動するスクロール ポイントを教えてくれる

  13. [scrollView - アニメーションを使用して新しい scrollPoing に調整するように scrollView に指示する

4

1 に答える 1

4

Appleがそれをどのように行っているのかはわかりません。コンテンツをスクロールビューに入れてから、テキストフィールドをタップすると、スクロールビューに上にスクロールして入力内容を確認できるようにすることをお勧めします。

私は少し怠惰な人なので、ユーザーがキーボードで非表示になるフィールドをタップすると、ビュー自体が上にシフトするように指示するだけです。

私は通常これを次のように行います:

// shift view up
self.view.transform = CGAffineTransformMakeTranslation(0, -someYOffsetValue);

// shift view back down to original value
self.view.transform = CGAffineTransformMakeTranslation(0, 0);

これをUIViewanimateWithDuration:ブロックでラップして、スムーズに移行できます。

于 2012-09-10T04:37:22.690 に答える