使用 IQKeyboardManager 這個開源庫,基本可以應(yīng)對大部分情況,但是在某些情況下,這個框架會有bug,比如只能自己來實現(xiàn)了
使用KVO監(jiān)聽鍵盤彈出的通知即可:
這里我是用的是ReactiveCocoa 來實現(xiàn)的
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillChangeFrameNotification object:nil] subscribeNext:^(id x) {
NSNotification *noti = x;
CGFloat duration = [noti.userInfo [UIKeyboardAnimationDurationUserInfoKey] floatValue] ;
//
CGRect keyboardFrame = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
if (keyboardFrame.origin.y >= self.view.height) { // 鍵盤未彈出
[UIView animateWithDuration:duration animations:^{
//
self.bottomToolBarView.transform = CGAffineTransformIdentity;
}];
} else { // 鍵盤彈出
[UIView animateWithDuration:duration animations:^{
//
self.bottomToolBarView.transform = CGAffineTransformMakeTranslation(0, -keyboardFrame.size.height);
}];
}
}];
如果有使用IQKeyboardManager,建議在頁面關(guān)閉IQKeyboardManager的功能
- (void)viewWillAppear:(BOOL)animated {
// 關(guān)閉 IQKeyboardManager
[IQKeyboardManager sharedManager].enable = NO;
}
-(void)viewWillDisappear:(BOOL)animated{
//
[IQKeyboardManager sharedManager].enable = YES;
}
其它實現(xiàn):
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleKeyboard:) name:UIKeyboardWillChangeFrameNotification
object:nil];
- (void)handleKeyboard:(NSNotification *)noti {
CGFloat duration = [noti.userInfo [UIKeyboardAnimationDurationUserInfoKey] floatValue] ;
CGRect keyboardFrame = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
if (keyboardFrame.origin.y >= self.view.height) { // 鍵盤未彈出
[UIView animateWithDuration:duration animations:^{
self.tableView.transform = CGAffineTransformIdentity;
}];
} else { // 鍵盤彈出
[UIView animateWithDuration:duration animations:^{
self.tableView.transform = CGAffineTransformMakeTranslation(0, -keyboardFrame.size.height);
}];
}
}