これは奇妙な問題です。キーボードが表示されているときにキーボードを回避するためにアニメーションを必要とするいくつかのテキストフィールドを持つ新しいユーザーを作成するための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 を含むビューを追加すると、アニメーションが再び機能します。なぜかはまだわかりませんが。