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 回答