现象描述:

点击UITextView,键盘会弹出。然后点击添加图片,弹出了ActionSheet,键盘自动收缩。接着关闭ActionSheet,发现键盘又弹出了,接着点击Done,想要隐藏键盘,却发现视图出现移动异常。项目中已集成IQKeyboardManager框架。

现象截图:

原因假设:

1.一开始点击UITextView,UITextView获得焦点,键盘正常弹出。此时如果不点击添加图片,直接点击Done是没有异常出现的,在我点击添加图片的时候,系统默认关闭键盘,然后弹出ActionSheet,在我关闭ActionSheet之后,系统为了恢复到弹出ActionSheet之前的状态,就又调出了键盘,此时点击Done,由于IQKeyboardManager可能会记录键盘的Offset,所以点击Done的时候移动了VC的frame。

查看问题后的VC的Frame的:

经过仔细排查,发现上面的Frame和ActionSheet的Frame是类似的,初步确定IQKeyboardManager在获取VC的时候,把RootVC回溯到ActionSheet上去了,这。。。

后来又打断点调试,发现执行到634行的时候代码获取到了错误的Frame,然后,我就进一步确定是获取到了ActionSheet的Frame。

然后我按住command点击topMostController,看看里面到底是怎么实现的。

附上解决后的代码:

- (UIViewController*) topMostController
{
UIViewController *topController = [self rootViewController]; // Getting topMost ViewController
/** //原始代码
while ([topController presentedViewController]){
topController = [topController presentedViewController];
}
*/ //修改后的代码
while ([topController presentedViewController]){
UIViewController *vc = [topController presentedViewController];
if (CGSizeEqualToSize(vc.view.frame.size, [[UIScreen mainScreen] bounds].size)) {
topController = vc;
}else{
break;
}
} // Returning topMost ViewController
return topController;
}

原始代码是框架中原本的代码,修改后的代码是我自己添加的代码,修改过后,代码就没有问题了哦,哈哈,感谢这篇博客,我在写博客的过程中把思路理顺了,才无意中发现了解决办法,以后碰到问题,也应该理顺思路,一步步分析。最后附上解决后的截图。

最后说明一下,RootVC最后的Frame和ActionSheet的Frame为何只有x、y相同,而Width和Height的不相同。原因见下面的截图:

这个方法会在UIKeyboardWillHideNotification发出之后执行,由于我的系统是iOS 10的,所以这个Frame的Size会在这里修改。而需要注意的是在修改Size之前,这里也回溯了一遍RootVC,难道此处回溯的VC就不会回溯到ActionSheet吗?理论上是不会的。

因为IQKeyboardManager的目的就是:在键盘弹出之前记录下RootVC的Frame,然后上移视图,然后在键盘消失的时候重新还原RootVC的Frame,因此2次获取的RootVC必须是同一个对象,但是如果获取的是不一样的对象就会出现视图偏移异常。而ActionSheet和Alert都是由UIAlertViewController来控制,因此理论上这两种场景下都会出现视图偏移的问题。

iOS奇怪的问题,键盘偏移异常的更多相关文章

  1. iOS已发布应用中对异常信息捕获和处理

    iOS已发布应用中对异常信息捕获和处理 iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的. iO ...

  2. iOS 11 导航栏 item 偏移问题 和 Swift 下 UIButton 设置 title、image 显示问题

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. iOS 开发之 - 关闭键盘 退出键盘 的5种方式

    iOS 开发之 - 关闭键盘 退出键盘 的5种方式   1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5 ...

  4. iOS开发自己定义键盘回车键Return Key

    在iOS开发中.用户在进行文本输入的时候,往往会用到虚拟键盘上的回车键,也就是Return Key.回车键有时候能够是"完毕"(表示输入结束).能够是"下一项" ...

  5. iOS Android中 h5键盘遮挡输入框的问题和解决方案

    问题发现:在 Android 部分机型 和 iOS部分系统下 键盘会出现遮挡输入框的情况(壳内).问题解决: Android 经过测试,Android 的6.0版本以上均会出现改问题,归根到底是之前的 ...

  6. iOS、Xcode监测键盘的显示和隐藏变化,并获得键盘高度,改变tableView的frame和偏移

    <pre name="code" class="objc"><pre name="code" class="ob ...

  7. iScroll4下表单元素聚焦及键盘的异常问题

    本文是zawa同事写的一篇博文,相信很多在webapp开发中的同学使用iscroll4会遇到的该问题,问过zawa兄的建议,在这里分享给大家,希望能帮助到各位~ 原文地址:http://www.zaw ...

  8. iOS 自定义emoji表情键盘

    之前走了很多弯路,包括自己定以emoji表情,自己创建view类去处理图文混排 ,当把这些焦头烂额的东西处理完了才发现 ,其实系统自带键盘是如此的方便,iOS 系统自带的表情在view,textfie ...

  9. ios设备触发虚拟键盘输入后position:fixed 无效的一些简单另类的解决方法。

    首先看一下我要解决的问题,第一张图是正常的情况下,第二张图是点击了输入框之后的情况,就是要解决此问题~! 百度了一下解决方法,好像有以下的一些方法: 1. iscroll 2. Jquery Mobi ...

随机推荐

  1. Wrapper配置详解及高级应用

      将一个简单的程度如HelloWorld 的应用包装秤Wrapper 服务并不复杂,甚至可以认为非常简单.但是实际项目应用过程中我们的程序一般较庞大,运行环境也较复杂. 通过Wrapper 配置文件 ...

  2. jqweui tabbar使用示例

    <!DOCTYPE html> <html class="pixel-ratio-1"> <head> <meta http-equiv= ...

  3. ubuntu查看Mysql是否已启动

    sudo netstat -tap | grep mysql 命令行输出: tcp6       0      0 [::]:mysql              [::]:*             ...

  4. sql获取数组长度

    需求:获取字符串数组1,2,3,4的长度,当然也可以是其他分隔符1|2|3等 方法:通过自定义函数来实现 /* 获取字符串数组长度 */ from sysobjects where id = obje ...

  5. SpringBoot学习笔记(2):引入Spring Security

    SpringBoot学习笔记(2):用Spring Security来保护你的应用 快速开始 本指南将引导您完成使用受Spring Security保护的资源创建简单Web应用程序的过程. 参考资料: ...

  6. ThinkPHP中Widget的两种写法及调用

    Widget扩展一般用于页面组件的扩展,在页面根据需要输出不同的内容,下面介绍一下ThinkPHP中Widget的两种写法及调用 写法一: ArticlWidget.class.php文件: clas ...

  7. Kattis - fairdivision 【贪心】

    题意 有一堆人 要给他们的朋友 买一个生日礼物,然后 每个人 给出自己的最大负担额度 并且给出礼物总价 然后要给出一种解决方案 尽量让 所有人的支出都接近平均,如果实在无法平均,那就让 先来的人 多处 ...

  8. Python程序打包成exe的一些坑

    今天写了一个项目,Python项目,需要在win7上跑起来,我想,这不是简单的不行么,直接上Pyinstaller不就完了? 但是后来,我发觉我真是too young too simple. 为什么这 ...

  9. DNS 原理入门 (转)

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

  10. JS实现下拉列表的二级联动

    这个是简单也是最基本的下拉框联动的示例,这个示例主要针对那些只有二级联动,且第一级是固定的选项,第二级的内容也比较简单,不刷新的联动,动态的联动需要检索数据库,这个对不需要更新的二级联动比较实用.这里 ...