UITextField丢失firstResponder会恢复帧动画/修改

时间:2013-01-29 03:33:40

标签: ios ios6 nsanimation

我使用以下代码修改帧大小以容纳显示/消失的键盘:

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的项目是否设置为使用autolayout?如果是,那么在使用Interface Builder时会自动为您创建约束,仅仅更改组件的框架是不够的,您需要调整对这些组件的约束。您通常通过将约束链接到IBOutlet属性并修改它们上的constant属性来实现此目的。