如何解决由引起的IQKeyboardManager部分页面返回的键盘高度比实际小或最后收到键盘隐藏通知却显示了键盘问题

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

部分页面需要显示一个工具栏,当键盘出现时,这个工具栏显示在键盘上方。由于使用了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:^
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值