最初のレスポンダを失うUITextFieldは、フレームのアニメーション/修正を元に戻します。

私は次のコードを使用して、表示/非表示のキーボードに対応するフレームサイズを変更します。

- (void)moveCodeViewForKeyboard:(NSNotification*)aNotification up:(BOOL)up {
    NSDictionary* userInfo = [aNotification userInfo];
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardEndFrame;

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];

    CGRect newFrame = codeView.frame;
    CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil];
    keyboardFrame.size.height += keyboardToolbar.frame.size.height;
    keyboardFrame.size.height += 10;
    newFrame.size.height -= keyboardFrame.size.height * (up?1:-1);
    codeView.frame = newFrame;

    [UIView commitAnimations];
}

このコードは、キーボードの表示/非表示時にアニメートされる他のいくつかのサブビューに対して繰り返されます。

UITextFieldをタップすると、すべてのアニメーションが正しく表示されます。しかし、私はすぐにUITextViewをタップすると、以前アニメーション化されていたすべての要素(UIToolbar、UITextView、UIWebView)が元のフレーム(位置とサイズ)に戻り、もはやアニメーション化されなくなります。 UITextFieldがfirstResponderである間にキーボードを閉じると、要素は元のフレームに戻りますが、再びアニメーション化されます。

非常に奇妙な...

私は人々が尋ねると思うので、

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSLog(@"textFieldDidEndEditing");
}

前もって感謝します!

3
nl ru de
それ以上のプレーをした後、UIView(またはサブクラス)のフレーム値(サイズまたは位置)を変更することに関連するので、アニメーションにあまり関係していないようです。永続性を許さない親ビューにはいくつかの設定が必要です...おそらく?
追加された 著者 Jason Pawlak,

1 答え

あなたのプロジェクトは autolayout を使うように設定されていますか? Interface Builderを使用しているときに制約が自動的に作成されていて、コンポーネントのフレームをただちに変更するだけでは不十分な場合は、それらのコンポーネントに対する制約を調整する必要があります。通常は、制約を IBOutlet のプロパティにリンクし、それらの定数プロパティを変更します。

0
追加された