部分页面需要显示一个工具栏,当键盘出现时,这个工具栏显示在键盘上方。由于使用了IQKeyboardManager,导致有的页面iOS12.5.6系统的手机出现首次键盘高度比实际低44像素,而iOS14.7.1系统的手机出现首次键盘高度比实际低44像素并且有时出现最后收到键盘隐藏通知但是实际显示了键盘。
收到通知直接设置工具栏的frame,也过于突兀,最好采用做动画的方式显示工具栏,动画完成时再修正键盘高度,这样能部分解决上面的那两个问题。
那键盘的动画时间是0.25秒,可以在键盘通知里获取到这个参数。那键盘的实际高度从哪里获取呢?经过观察View UI Herarchy发现有键盘的页面都有UIInputSetContainerView,键盘的总高度就是UIInputSetHostView的总高度。只是iOS13及跟高的系统,键盘是在第二个窗口的UIInputWindowController中,而比iOS13低的版本在第是哪个窗口的UITextEffectsWindow中。具体的实现如下:
增加键盘显示通知:
//监听键盘的变化
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardChange:) name:UIKeyboardWillShowNotification object:nil];
键盘通知处理:
- (void)keyBoardChange:(NSNotification *)notification {
//获取键盘的高度
NSDictionary *userInfo = [notification userInfo];
NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValue CGRectValue];
CGFloat height = keyboardRect.size.height;
//获取动画时间I
CGFloat animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
NSLog(@"animationDuration:%f,height:%f",animationDuration,height);
if(self.keyBoardChangeBlock)
{
self.keyBoardChangeBlock(height, animationDuration);
}
}
键盘显示动画与修正:
- (LCCommentToolView *)comTool {
if (_comTool == nil) {
_comTool = [[LCCommentToolView alloc] initWithFrame:CGRectMake(0, 0, KScreenW, BaseSize(100))] ;
[_comTool setCorner:UIRectCornerTopLeft|UIRectCornerTopRight cornerSize:BaseSize(15) forRect:CGRectMake(0, 0, KScreenW, BaseSize(100))];
DYWeakSelf;
[_comTool setKeyBoardChangeBlock:^(CGFloat height, CGFloat animationDuration) {
if (DYGlobleData.isLogin) {
if(animationDuration <= 0)
{
//防范式编程,理论不会出现
weakSelf.bgV.hidden = NO;
}
else
{
weakSelf.bgV.hidden = (height<=0);
[UIView animateWithDuration:animationDuration animations:^{
if((height<=0))
{
[weakSelf.comTool mas_updateConstraints:^

这篇博客详细介绍了在iOS应用中处理键盘显示与工具栏动画的问题。通过监听键盘通知,获取键盘高度和动画时间,动态调整工具栏的位置,解决了因IQKeyboardManager导致的键盘高度异常和动画不平滑的问题。同时,针对不同iOS版本,文中提供了查找键盘视图层级的方法,以获取键盘实际高度。整个过程结合了视图控制器、约束布局和动画,确保了在不同系统版本上的兼容性。
最低0.47元/天 解锁文章
3331

被折叠的 条评论
为什么被折叠?



