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横屏弹键盘高度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IOS 开发APP之关于时间处理详细介绍

    IOS 开发APP之关于时间处理详细介绍

    这篇文章主要介绍了IOS 开发APP之关于时间处理详细介绍的相关资料,开发APP 不仅需要对API的调用还需要对时间相关的各种API之间的差别,再因场景而异去设计相应的机制,需要的朋友可以参考下
    2016-12-12
  • IOS开发之路--C语言指针

    IOS开发之路--C语言指针

    指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚
    2014-08-08
  • 实例详解IOS开发之UIWebView

    实例详解IOS开发之UIWebView

    iOS开发之UIWebView 是本文要介绍的内容,UIWebView是iOS sdk中一个最常用的控件,是内置的浏览器控件,我们可以用它来浏览网页、打开文档等等
    2016-02-02
  • iOS自定义UIDatePicker日期选择器视图

    iOS自定义UIDatePicker日期选择器视图

    这篇文章主要为大家详细介绍了iOS自定义UIDatePicker日期选择器视图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • iOS开发之视图切换

    iOS开发之视图切换

    在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将一一介绍,希望大家能够喜欢。
    2016-04-04
  • iOS使用UICollectionView实现拖拽移动单元格

    iOS使用UICollectionView实现拖拽移动单元格

    这篇文章主要为大家详细介绍了iOS开发UICollectionView拖拽移动单元格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • iOS开发检测是否开启定位、是否允许消息推送等权限的实例

    iOS开发检测是否开启定位、是否允许消息推送等权限的实例

    下面小编就为大家分享一篇iOS开发检测是否开启定位、是否允许消息推送等权限的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • iOS实现电商购物车界面示例

    iOS实现电商购物车界面示例

    这篇文章主要为大家详细介绍了iOS实现一个类似电商购物车界面示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • ios 11和iphone x的相关适配问题及解决方法

    ios 11和iphone x的相关适配问题及解决方法

    这篇文章主要介绍了ios 11和iphone x的相关适配,文中给大家提到了在ios 11中,tableView会莫名偏移问题的解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • IOS自带Email的两种方法实例详解

    IOS自带Email的两种方法实例详解

    这篇文章主要介绍了IOS自带Email的两种方法实例详解的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论