iOS07 键盘弹出,回收,位置
因为iOS移动设备屏幕大小有限,不能像桌面用鼠标随意拖动,所以类似登陆页面输入时,常把输入框避开虚拟键盘,或者虚拟键盘弹出时输入框移动到可见位置。需要做的是让UItextfield设置代理,然后利用其代理方法: //键盘收回时代理函数,这里设置登陆框归位 - (void)textFieldDidEndEditing:(UITextField *)textField{// [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationCurveLinear animations:^{ [loginView setFrame:CGRectMake(296, 376, 432, 300)]; } completion:nil]; } //键盘弹出时代理函数,这里设置登陆框移动到可见区域 - (void)textFieldDidBeginEditing:(UITextField *)textField{ [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationCurveLinear animations:^{ [loginView setFrame:CGRectMake(296, 88, 432, 300)]; } completion:nil]; } //点击确定后键盘收回 -(BOOL)textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; return YES; } 此外,中文输入法不同于英文输入法会有选字的区域,也就是说比英文输入法键盘高 高度不一样 所以要想真正让输入框适应键盘高度,应该获取键盘的动态高度然后让输入框位置匹配,添加一个监听通知然后修改位置: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; - (void)keyboardWillShow:(NSNotification *)notification { NSDictionary *info = [notification userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size; //UIKeyboardCenterEndUserInfoKey int changeBalue=715-kbSize.height; [searchView setFrame:CGRectMake(0, changeBalue, 284, 53)]; } 但是实际上objectForKey:UIKeyboardBoundsUserInfoKey已经被弃用了,虽然目前还可以用,文档说建议用UIKeyboardFrameBeginUserInfoKey替代,使用方法以后更新 -(void)textFieldDidBeginEditing:(UITextField *)textField { userName.hidden=YES; loginPass.hidden=YES; loginButton.hidden=YES; [selfregNotification]; } -(void)textFieldDidEndEditing:(UITextField *)textField { userName.hidden=NO; loginPass.hidden=NO; loginButton.hidden=NO; [selfunregNotification]; } - (void)regNotification { [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(keyboardWillChangeFrame:)name:UIKeyboardWillChangeFrameNotificationobject:nil]; } - (void)unregNotification { [[NSNotificationCenterdefaultCenter] removeObserver:selfname:UIKeyboardWillChangeFrameNotificationobject:nil]; } #pragma mark - notification handler - (void)keyboardWillChangeFrame:(NSNotification *)notification { NSDictionary *info = [notification userInfo]; CGFloat duration = [[infoobjectForKey:UIKeyboardAnimationDurationUserInfoKey]floatValue]; CGRect beginKeyboardRect = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]; CGRect endKeyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGFloat yOffset = endKeyboardRect.origin.y - beginKeyboardRect.origin.y; CGRect inputFieldRect = RegName.frame; CGRect moreBtnRect = RegPass.frame; inputFieldRect.origin.y += yOffset+50; moreBtnRect.origin.y += yOffset+50; NSLog(@"%f-----%f--------%f----%f",inputFieldRect.origin.x,inputFieldRect.origin.y,inputFieldRect.size.width,inputFieldRect.size.height); [UIViewanimateWithDuration:duration animations:^{ RegName.frame = inputFieldRect; RegPass.frame = moreBtnRect; }]; }
//监听键盘高度变化 [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(keyboardWasChange:)name:UIKeyboardDidChangeFrameNotificationobject:nil]; - (void)keyboardWasChange:(NSNotification *)aNotification { NSLog(@"Keyboard change"); NSString *str=[[UITextInputModecurrentInputMode] primaryLanguage]; NSLog(@"shurufa--------------%@",str); // if ([str isEqualToString:@"zh-Hans"]) { // ReplayView.frame = CGRectMake(0, HEIGHT.height-216-125, 320, 45); // }else // { // ReplayView.frame = CGRectMake(0, HEIGHT.height-216-89, 320, 45); // // // } NSDictionary *info = [aNotification userInfo]; CGSize kbSize = [[infoobjectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].size; // CGRect frame = self.search.frame; if (kbSize.height ==216) { NSLog(@"english"); ReplayView.frame =CGRectMake(0, HEIGHT.height-216-89,320, 45); } else if(kbSize.height ==252){ NSLog(@"中文"); ReplayView.frame =CGRectMake(0, HEIGHT.height-216-125,320, 45); } // 输入的时候整体向上移动。