我使用以下代码修改帧大小以容纳显示/消失的键盘:
- (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");
}
提前致谢!
答案 0 :(得分:0)
您的项目是否设置为使用autolayout
?如果是,那么在使用Interface Builder时会自动为您创建约束,仅仅更改组件的框架是不够的,您需要调整对这些组件的约束。您通常通过将约束链接到IBOutlet
属性并修改它们上的constant
属性来实现此目的。