iOS横屏弹键盘的高度错误异常解决

 更新时间:2021年04月15日 11:24:20   作者:yoferzhang  
这篇文章主要给大家介绍了关于iOS横屏弹键盘的高度错误异常解决的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题:横屏下第一次弹出键盘高度异常

- (void)handleKeyboardWillShowNotification:(NSNotification *)notification {
    NSTimeInterval animationDuration = 0;
    CGRect keyboardFrame = CGRectZero;
    NSDictionary *userInfo = [notification userInfo];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];
    
    printf("keyboardFrame height: %f\n", keyboardFrame.size.height);

    [self showWithAnimationDuration:animationDuration keyboardFrame:keyboardFrame];
}

弹出新window,rootViewController里面有个 UITextField ,然后调用 becomeFirstResponder ,启动app,第1次弹出键盘时,会走进两次通知,打印键盘高度:

keyboardFrame height: 125.000000
keyboardFrame height: 302.000000

这两个高度都是错误的,会导致键盘上面的工具条错位:

第2次弹出键盘时:打印键盘高度为:

keyboardFrame height: 248.000000

这时候就是正常的高度了。

需要解决第一次异常的问题。

解决:直接取子view判断

查看层级,发现键盘window有个子view UIInputSetHostView,这就是键盘显示的父view,这时候取得这个view,也就取得了键盘的真正高度:

- (CGFloat)keyboardHeight {
   UIWindow *keyboardWindow = [[[UIApplication sharedApplication] windows] lastObject];
   UIView *inputView = [keyboardWindow.rootViewController.view tkp_findSubview:@"UIInputSetHostView"];
   if (inputView) {
       return inputView.tkp_height;
   }
   return 0;
}

其中 tkp_findSubview: 方法为 UIView 的分类方法:

- (UIView *)tkp_findSubview:(NSString *)name {
    return [self tkp_findSubview:name resursion:NO];
}

- (UIView *)tkp_findSubview:(NSString *)name resursion:(BOOL)resursion {
    Class class = NSClassFromString(name);
    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:class]) {
            return subview;
        }
    }

    if (resursion) {
        for (UIView *subview in self.subviews) {
            UIView *tempView = [subview tkp_findSubview:name resursion:resursion];
            if (tempView) {
                return tempView;
            }
        }
    }

    return nil;
}

总结

到此这篇关于iOS横屏弹键盘的高度错误异常解决的文章就介绍到这了,更多相关iOS横屏弹键盘高度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Flutter Widgets之标签类控件Chip详解

    Flutter Widgets之标签类控件Chip详解

    这篇文章主要为大家介绍了Flutter Widgets之标签类控件Chip详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • iOS各种ViewController控制器使用示例完整介绍

    iOS各种ViewController控制器使用示例完整介绍

    这篇文章主要为大家介绍了iOS各种ViewController控制器使用示例完整介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 谈谈为何iOS开发别用宏来定义常量

    谈谈为何iOS开发别用宏来定义常量

    最近在工程里看到很多不规范的使用,于是来写一篇博客来让不是很清楚的小朋友们,使用正确的规范开发ios,少埋点坑。
    2016-08-08
  • 理解Objective-C的变量以及面相对象的继承特性

    理解Objective-C的变量以及面相对象的继承特性

    这篇文章主要介绍了理解Objective-C的变量以及面相对象的继承特性,文中的所说的点语法即是'对象名.成员变量名'这种对变量的访问,需要的朋友可以参考下
    2016-01-01
  • iOS实现高效裁剪图片圆角算法教程

    iOS实现高效裁剪图片圆角算法教程

    经常看到各种高效裁剪圆角的文章,正好之前做过一点数字图像处理,所以写个裁剪圆角的算法,下面这篇文章主要给大家介绍了关于iOS实现高效裁剪图片圆角算法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-06-06
  • iOS开发实现搜索框(UISearchController)

    iOS开发实现搜索框(UISearchController)

    这篇文章主要为大家详细介绍了iOS开发实现搜索框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • iOS下Safari点击事件失效的解决方法

    iOS下Safari点击事件失效的解决方法

    这篇文章主要给大家介绍了关于在iOS下Safari点击事件失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • iOS验证手机号的正则表达式

    iOS验证手机号的正则表达式

    这篇文章主要为大家详细介绍了iOS验证手机号的正则表达式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • iOS中最全的各种定时器使用教程

    iOS中最全的各种定时器使用教程

    这篇文章主要给大家介绍了关于iOS中最全的各种定时器的使用教程,文中通过示例代码介绍的非常详细,通过文中介绍的最全的定时器相信会对各位iOS开发者们带来一定的帮助,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • iOS用UITextField切换明文/密文显示时末尾空白的问题解决

    iOS用UITextField切换明文/密文显示时末尾空白的问题解决

    最近在工作中遇到一个问题,利用UITextField切换明文/密文显示时发现字符串后面会出现一段空白,所以下面这篇文章主要给大家介绍了iOS用UITextField切换明文/密文显示时末尾空白问题的解决方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05

最新评论