1、注册监听键盘事件的通知:
[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardShow:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardHide:)
name:UIKeyboardDidHideNotification
object:nil];
2、在键盘将要出现和隐藏的回调中,加入动画。
键盘弹出在消息方法里更新约束:
-(void)keyBoardWillShow:(NSNotification*)noti {
// 获取键盘基本信息(动画时长与键盘高度)
NSDictionary *userInfo = [noti userInfo];
CGRect rect =
[userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGFloat keyboardHeight = CGRectGetHeight(rect);
CGFloat keyboardDuration =
[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// 修改下边距约束
[_textField mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(-keyboardHeight);
}];
// 更新约束
[UIView animateWithDuration:keyboardDuration animations:^{
[self.view layoutIfNeeded];
}];
}
- (void)keyboardShow:(NSNotification *)notif
{
NSLog(@"已经显示");
if (self.hidden == YES) {
return;
}
}
- (void)keyboardWillHide:(NSNotification *)notif
{
NSLog(@"将要隐藏");
if (self.hidden == YES) {
return;
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.25];
NSArray *subviews = [self.view subviews];
for (UIView *sub in subviews) {
if (sub.center.y < CGRectGetHeight(self.view.frame)/2.0) {
sub.center = CGPointMake(CGRectGetWidth(self.view.frame)/2.0, CGRectGetHeight(self.view.frame)/2.0);
}
}
[UIView commitAnimations];
}
键盘收起时在textField代理方法中再次更新约束
-(void)keyboardWillDisappear:(NSNotification *)noti {
// 获取键盘基本信息(动画时长与键盘高度)
NSDictionary *userInfo = [noti userInfo];
CGRect rect =
[userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
// CGFloat keyboardHeight = CGRectGetHeight(rect);
CGFloat keyboardDuration =[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[_textField mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(-40);
}];
[UIView animateWithDuration:keyboardDuration animations:^{
[self.view layoutIfNeeded];
}];
}
- (void)keyboardHide:(NSNotification *)notif
{
NSLog(@"已经隐藏");
if (self.hidden == YES) {
return;
}
}
3、关闭键盘:
方法一:
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
[self.view endEditing:YES];
方法二:
[[self findFirstResponderBeneathView:self] resignFirstResponder];
[[self findFirstResponderBeneathView:self] becomeFirstResponder];//打开键盘
- (UIView*)findFirstResponderBeneathView:(UIView*)view
{
// Search recursively for first responder
for ( UIView *childView in view.subviews ) {
if ( [childView respondsToSelector:@selector(isFirstResponder)] && [childView isFirstResponder] )
return childView;
UIView *result = [self findFirstResponderBeneathView:childView];
if ( result )
return result;
}
return nil;
}