前言: 在应用中不可避免使用到评论或者聊天输入框,但是或多或少都会出现下面和简书一样的效果,在返回的时候,输入框会被键盘遮挡,这一点微信和支付宝做的不错,对于细节控来说,这个不能忍。
可以看到,在侧滑返回的时候自定义的输入框会被键盘遮挡,但是微信或者支付宝的键盘看起来就是一体的,如果你是细节控有强迫症,你肯定也想实现这种一体键盘。
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
网友评论