1

これは奇妙な問題です。キーボードが表示されているときにキーボードを回避するためにアニメーションを必要とするいくつかのテキストフィールドを持つ新しいユーザーを作成するためのiPhoneビューコントローラーがあります。つまり、ビューは上下にアニメーション化され、キーボードの上部とテキストフィールド。ストーリーボードの最初のView Controllerであるログイン既存ユーザー画面からモーダルに表示されたとき、それはうまくいきました。

次に、ログイン/ユーザー作成ビューが同じView Controllerに属するように、アプリを少し変更することにしました。それらは次のように移行します。

if(accountCreateView == nil) {
    UINib *nib = [UINib nibWithNibName:@"NewAccountView" bundle:nil];
    NSArray *nibViews = [nib instantiateWithOwner:self options:nil];
    accountCreateView = [nibViews objectAtIndex:0];
}

[UIView transitionFromView:(displayingLoginView ? loginView : accountCreateView)
                    toView:(displayingLoginView ? accountCreateView : loginView)
                  duration:0.6
                   options:(displayingLoginView ? 
                            UIViewAnimationOptionTransitionFlipFromRight :
                            UIViewAnimationOptionTransitionFlipFromLeft)
                completion:^(BOOL finished) {
                    if (finished) {
                        displayingLoginView = !displayingLoginView;
                    }
                }
];

これもうまくいきます。ただし、ビューのアニメーションを行うコードはそうではありません。テキスト フィールドがアクティブになると、テキスト フィールドとキーボードの距離をチェックするコードが呼び出されますが、アニメーション ブロックの実行時には何も起こりません。

だから私はチェックしました:

if([UIView areAnimationsEnabled])
    NSLog(@"Animations are enabled");
else 
    NSLog(@"Animations are disabled");

アニメーションは確かに有効になっています。

そこで私はそれをさらに viewDidLoad に戻し、単純なアニメーションを試して何が機能するかを確認しました。

CGRect viewFrame = loginNameTextField.frame;
viewFrame.origin.y = 400.f;
[UIView animateWithDuration:1.f 
                      delay:0.f 
                    options:UIViewAnimationOptionCurveEaseInOut 
                 animations:^ {
                     loginNameTextField.frame = viewFrame;
                 }
                 completion:NULL];

これはうまくいきます!テキスト フィールドがウィンドウをゆっくりと下に移動します。

これは何もしません。それが紛らわしい部分です。

CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
[UIView animateWithDuration:1.f 
                      delay:0.f 
                    options:UIViewAnimationOptionCurveEaseInOut 
                 animations:^ {
                     self.view.frame = viewFrame;
                 }
                 completion:NULL];

viewFrame を self.view.frame から設定すると、予想どおり原点が 0,20、サイズが 320,460 になります。

フレームプロパティを直接設定してみました:

CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
self.view.frame = viewFrame;

self.view のサブビューのフレームは変更できますが、self.view のフレームは変更できないようです。解決策としては、最初のビュー コントローラーをストーリーボードの空白のビューのままにして、ログイン ビューとユーザー ビューの作成の両方に xib を作成し、それらを viewDidLoad にロードすることがありますが、なぜでしょうか?

編集: はい、ビュー コントローラーのストーリーボード バージョンをプレーンな空のビューに切り替え、サブビューとして xib からの実際の UI を含むビューを追加すると、アニメーションが再び機能します。なぜかはまだわかりませんが。

4

1 に答える 1

1

テキスト フィールドをキーボードの上に置いておくだけでよい場合は、UIViewController を削除して UITableViewController に変更し、静的セルを使用してみませんか? セルごとに 1 つのテキスト フィールドを配置し (必要に応じて十分な数のセルを作成します)、好きなようにスタイルを設定します。ファーストレスポンダがなく、画面に収まる十分な数のセルがない場合、スクロールしません。収まりきらない数がある場合は、スクロールして下部/上部のセルに到達します。セルの数に関係なく、キーボードで隠れるテキスト フィールドを選択すると、デバイスはセルを表示可能な位置に自動的にスクロールします。すべてが組み込まれており、私はこの機能を常に使用しています。テキスト フィールドとテキスト ビューで動作します。セクションの数、セクションごとの行数、静的セルが正しく機能するように、インデックス パス メソッドのセル。多くのコーディングを節約できます。

HTH

ロブ

于 2012-02-01T21:06:54.607 に答える