大家都很熟悉下面这3个代理函数:
#pragma mark - UITextFieldDelegate
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
NSLog(@"textFieldDidBeginEditing");
CGRect frame = textField.frame;
NSLog(@"self h:%f",self.view.frame.size.height);
NSLog(@"frame y:%f", frame.origin.y);
NSLog(@"key board h:%f",KEYBOARD_H);
float offset = frame.origin.y + frame.size.height - (self.view.frame.size.height - KEYBOARD_H) + 15;//键盘高度253
NSLog(@"offset:%f", offset);
NSTimeInterval animationDuration = 0.3f;
[UIViewbeginAnimations:@"ResizeForKeyboard"context:nil];
[UIView setAnimationDuration:animationDuration];
//将视图的Y坐标向上移动offset个单位,以使下面腾出地方用于软键盘的显示
if(offset > 0)
self.view.frame =CGRectMake(0.0f, -offset,self.view.frame.size.width,self.view.frame.size.height);
[UIViewcommitAnimations];
}
//当用户按下return键或者按回车键,keyboard消失
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
//输入框编辑完成以后,将视图恢复到原始状态
-(void)textFieldDidEndEditing:(UITextField *)textField
{
self.view.frame =CGRectMake(0,0, self.view.frame.size.width,self.view.frame.size.height);
}
他们实现的效果就是点击textField后弹出keyboard,输入content后按返回键合回车键,keyboard消失,而实际过程中 textField 有可能被keyboard挡住,所以就有上面对Frame的操作,keyboard弹出,整个UI的frame向上移动offset,keyboard消失,frame复原。- (void)setUpForDismissKeyboard {
NSNotificationCenter *nc = [NSNotificationCenterdefaultCenter];
UITapGestureRecognizer *singleTapGR =
[[UITapGestureRecognizeralloc] initWithTarget:self
action:@selector(tapAnywhereToDismissKeyboard:)];
NSOperationQueue *mainQuene =[NSOperationQueuemainQueue];
[nc addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note){
[self.viewaddGestureRecognizer:singleTapGR];
}];
[nc addObserverForName:UIKeyboardWillHideNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note){
[self.viewremoveGestureRecognizer:singleTapGR];
}];
}
- (void)tapAnywhereToDismissKeyboard:(UIGestureRecognizer *)gestureRecognizer {
//此method会将self.view里所有的subview的first responder都resign掉
[self.viewendEditing:YES];
}