键盘弹出,视图向上移,键盘高度遮住UITextField的解决方法
解决方法有两种:
第一种(常用,动画效果好)
首先,在viewDidLoad中对键盘添加监听
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillAppear:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillDisappear:) name:UIKeyboardWillHideNotification object:nil];
其次,计算键盘的高度
//传入的(NSDictionary *)userInfo用于存放键盘的各种信息,其中UIKeyboardFrameEndUserInfoKey对应的存放键盘的尺寸信息,以CGRect形式取出。
-(CGFloat)keyboardEndingFrameHeight:(NSDictionary *)userInfo
{
CGRect keyboardEndingUncorrectedFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];
CGRect keyboardEndingFrame = [self.view convertRect:keyboardEndingUncorrectedFrame fromView:nil];
return keyboardEndingFrame.size.height;
}
然后,根据键盘高度将当前视图向上滚动同样高度。
-(void)keyboardWillAppear:(NSNotification *)notification
{
CGRect currentFrame = self.view.frame;
//先恢复原位 //可能这个方法重复调用
currentFrame.origin.y = 0;
self.view.frame = currentFrame;
//change为监听的键盘高度,此处直接减去上移固定值100
//CGFloat change = [self keyboardEndingFrameHeight:[notification userInfo]];
//CGRectGetMaxY(self.IDCardTextField.frame)为IDCardTextField的最大Y坐标
//CGFloat textViewH = self.view.frame.origin.y - CGRectGetMaxY(self.IDCardTextField.frame);
if ([self.NameTextField isFirstResponder]||[self.IDCardTextField isFirstResponder]||[self.MobileTextField isFirstResponder]) {
currentFrame.origin.y = currentFrame.origin.y-100;
// currentFrame.origin.y = currentFrame.origin.y - change - textViewH;
self.view.frame = currentFrame;
NSLog(@"currentFrame--->%f",currentFrame.origin.y);
}
}
最后,当键盘消失后,视图需要恢复原状。
-(void)keyboardWillDisappear:(NSNotification *)notification
{
//恢复原位
CGRect currentFrame = self.view.frame;
currentFrame.origin.y = 0;
self.view.frame = currentFrame;
}
第二种(常用,不计算键盘高度,直接上移固定大小)
首先,在viewDidLoad中对键盘添加监听
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillAppear:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillDisappear:) name:UIKeyboardWillHideNotification object:nil];
然后,将当前视图向上滚动固定高度。
-(void)keyboardWillAppear:(NSNotification *)notification
{
CGRect currentFrame = self.view.frame;
//先恢复原位 //可能这个方法重复调用
currentFrame.origin.y = 0;
self.view.frame = currentFrame;
//此处直接减去上移固定值100
if ([self.NameTextField isFirstResponder]||[self.IDCardTextField isFirstResponder]||[self.MobileTextField isFirstResponder]) {
currentFrame.origin.y = currentFrame.origin.y-100;
self.view.frame = currentFrame;
// NSLog(@"currentFrame--->%f",currentFrame.origin.y);
}
}
最后,当键盘消失后,视图需要恢复原状。
-(void)keyboardWillDisappear:(NSNotification *)notification
{
//恢复原位
CGRect currentFrame = self.view.frame;
currentFrame.origin.y = 0;
self.view.frame = currentFrame;
}
第三种(不常用,动画效果不是很友好,间断,需要遮住一块黑色部分)
首先,开始编辑时,整体上移,调用上移方法moveView
//开始编辑时,整体上移,即frame的Y发生变化
- (void)textFieldDidBeginEditing:(UITextField *)textField{
if( (textField.tag==327)||(textField.tag==328)||(textField.tag==329)){
[self moveView:-100];
}
}
然后,上移方法moveView,实现界面动画效果
//上移Y轴,界面动画效果
-(void)moveView:(float)move{
NSTimeInterval animationDuration = 0.50f;
CGRect frame = self.view.frame;
frame.origin.y +=move;//view的Y轴上移
self.view.frame = frame;
[UIView beginAnimations:@"ResizeView" context:nil];
[UIView setAnimationDuration:animationDuration];
self.view.frame = frame;
[UIView commitAnimations];//设置调整界面的动画效果
}
最后,结束编辑时,整体下移
//结束编辑时,整体下移,其中(textField.tag==327) 可用[self.NameTextField isFirstResponder]代替
- (void)textFieldDidEndEditing:(UITextField *)textField{
if ( (textField.tag==327)||(textField.tag==328)||(textField.tag==329)){
[self moveView:100];
}
}