前言: 在應用中不可避免使用到評論或者聊天輸入框,但是或多或少都會出現下面和簡書一樣的效果,在返回的時候,輸入框會被鍵盤遮擋,這一點微信和支付寶做的不錯,對于細節控來說,這個不能忍。
可以看到,在側滑返回的時候自定義的輸入框會被鍵盤遮擋,但是微信或者支付寶的鍵盤看起來就是一體的,如果你是細節控有強迫癥,你肯定也想實現這種一體鍵盤。
1、首先還是要了解監聽鍵盤彈出的通知,鍵盤通知,這篇文章大概講述了幾個的通知的區別。
2、在使用通知UIKeyboardWillChangeFrameNotification 過程中也不可避免出現和簡書聊天鍵盤返回時輸入框被鍵盤遮擋的問題
看一下效果:
WillChangFrame.gif
可以看到,跟隨鍵盤做到了,但是在返回的時候還是會出現和簡書聊天鍵盤一樣的問題。
3、再加上一直很好奇,返回時輸入框和鍵盤一體返回是怎么實現的,如果我們在鍵盤Frame已經改變的時候然后再操作輸入框 會不會實現一體的效果呢 ,所以 試了一下UIKeyboardDidChangeFrameNotification這個通知。
看一下效果:
DidChangeFrame.gif
效果圖不是很明顯,在返回的時候做到了和鍵盤一起返回,假假的一體效果,但是 在進入Viewcontroller的時候,會 出現問題。后來發現是做了動畫效果。
4、最終如果要實現既能跟隨鍵盤一起上下,返回的時候也做成假假的一體效果,我們可以 結合兩個通知使用下,我們需要使用的是:UIKeyboardWillChangeFrameNotification的進入頁面后的效果,以及UIKeyboardDidChangeFrameNotification頁面消失后單獨處理鍵盤(不加動畫)
注冊兩個通知
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor =[UIColor whiteColor];
self.textview =[[UITextView alloc]initWithFrame:CGRectMake(20, KScreenH - 40, KScreenW-40, 40)];
self.textview.layer.borderColor = [UIColor blueColor].CGColor;
self.textview.layer.borderWidth =3;
self.textview.layer.cornerRadius = 5;
self.textview.layer.masksToBounds = YES;
[self.view addSubview:self.textview];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboarDidChangeFrame:) name:UIKeyboardDidChangeFrameNotification object:nil];
}
給一個是否做動畫的標識;
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
_isDisappear = NO;
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
_isDisappear = YES;
}
針對是否需要動畫對 通知做區分,DidChangeFrame不需要添加動畫:
-(void)keyboardWillChangeFrame:(NSNotification *)notification{
// if (self.picking) return;
/**
notification.userInfo = @{
鍵盤彈出\隱藏后的frame
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 352}, {320, 216}},
鍵盤彈出\隱藏所耗費的時間
UIKeyboardAnimationDurationUserInfoKey = 0.25,
鍵盤彈出\隱藏動畫的執行節奏(先快后慢,勻速)
UIKeyboardAnimationCurveUserInfoKey = 7
}
*/
NSDictionary *userInfo = notification.userInfo;
// 動畫的持續時間
double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// 鍵盤的frame
CGRect keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
NSLog(@"%@",NSStringFromCGRect(keyboardF));
// 執行動畫
if (!_isDisappear) {
[UIView animateWithDuration:duration animations:^{
// 工具條的Y值 == 鍵盤的Y值 - 工具條的高度
if (keyboardF.origin.y > self.view.height) {
self.textview.y = self.view.height- self.textview.height;
}else
{
self.textview.y = keyboardF.origin.y - self.textview.height;
}
NSLog(@"%f",self.textview.y);
}];
}
}
-(void)keyboarDidChangeFrame:(NSNotification *)notification{
// if (self.picking) return;
/**
notification.userInfo = @{
// 鍵盤彈出\隱藏后的frame
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 352}, {320, 216}},
// 鍵盤彈出\隱藏所耗費的時間
UIKeyboardAnimationDurationUserInfoKey = 0.25,
// 鍵盤彈出\隱藏動畫的執行節奏(先快后慢,勻速)
UIKeyboardAnimationCurveUserInfoKey = 7
}
*/
NSDictionary *userInfo = notification.userInfo;
// 動畫的持續時間
// double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// 鍵盤的frame
CGRect keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
NSLog(@"%@",NSStringFromCGRect(keyboardF));
// 執行動畫
// [UIView animateWithDuration:duration animations:^{
// 工具條的Y值 == 鍵盤的Y值 - 工具條的高度
if (_isDisappear) {
if (keyboardF.origin.y > self.view.height) {
self.textview.y = self.view.height- self.textview.height;
}else
{
self.textview.y = keyboardF.origin.y - self.textview.height;
}
}
}
最后假假的實現了這個效果:
Amy.gif