3

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

- (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");
}

前もって感謝します!

4

1 に答える 1

0

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

于 2013-04-03T20:14:28.280 に答える