iOS奇怪的问题,键盘偏移异常
现象描述:
点击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奇怪的问题,键盘偏移异常的更多相关文章
- iOS已发布应用中对异常信息捕获和处理
iOS已发布应用中对异常信息捕获和处理 iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的. iO ...
- 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 ...
- iOS 开发之 - 关闭键盘 退出键盘 的5种方式
iOS 开发之 - 关闭键盘 退出键盘 的5种方式 1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5 ...
- iOS开发自己定义键盘回车键Return Key
在iOS开发中.用户在进行文本输入的时候,往往会用到虚拟键盘上的回车键,也就是Return Key.回车键有时候能够是"完毕"(表示输入结束).能够是"下一项" ...
- iOS Android中 h5键盘遮挡输入框的问题和解决方案
问题发现:在 Android 部分机型 和 iOS部分系统下 键盘会出现遮挡输入框的情况(壳内).问题解决: Android 经过测试,Android 的6.0版本以上均会出现改问题,归根到底是之前的 ...
- iOS、Xcode监测键盘的显示和隐藏变化,并获得键盘高度,改变tableView的frame和偏移
<pre name="code" class="objc"><pre name="code" class="ob ...
- iScroll4下表单元素聚焦及键盘的异常问题
本文是zawa同事写的一篇博文,相信很多在webapp开发中的同学使用iscroll4会遇到的该问题,问过zawa兄的建议,在这里分享给大家,希望能帮助到各位~ 原文地址:http://www.zaw ...
- iOS 自定义emoji表情键盘
之前走了很多弯路,包括自己定以emoji表情,自己创建view类去处理图文混排 ,当把这些焦头烂额的东西处理完了才发现 ,其实系统自带键盘是如此的方便,iOS 系统自带的表情在view,textfie ...
- ios设备触发虚拟键盘输入后position:fixed 无效的一些简单另类的解决方法。
首先看一下我要解决的问题,第一张图是正常的情况下,第二张图是点击了输入框之后的情况,就是要解决此问题~! 百度了一下解决方法,好像有以下的一些方法: 1. iscroll 2. Jquery Mobi ...
随机推荐
- 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
[BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...
- js的new到底干了啥 -
javascript通过new操作符构建一个对象的步骤 <Javascript高级程序设计>的解释: 创建一个对象 将构造函数的作用域赋给新对象(把新对象作为构造函数的调用上下文,也就是t ...
- 记录-阿里云Oss文件上传
public class OssUtil { /** * 上传图片 * @param file * @param request * @return */ public static Map<S ...
- 九度OJ 1346:会员积分排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:967 解决:413 题目描述: 元旦佳节快到了,超市A想要给会员一些奖品.但是奖品有限,所以它需要给这些会员做一个排序,然后将名单输出来.排 ...
- 【python】-- 递归函数、高阶函数、嵌套函数、匿名函数
递归函数 在函数内部,可以调用其他函数.但是在一个函数在内部调用自身,这个函数被称为递归函数 def calc(n): print(n) if int(n/2) == 0: #结束符 return n ...
- Netbeans8.0设置Consola字体并解决中文乱码问题
在Netbeans8.0上开发php,设置字体为Consola后.发现中文显示是乱码的.经过改动jre的配置文件成功攻克了这个问题. 1. 进入jdk安装文件夹下/jre/lib文件夹,找到fontc ...
- shiro2
mapper接口:根据用户id查询用户权限的菜单 service接口:根据用户id查询用户权限的菜单 获取用户权限范围的url 思路: 在用户认证时,认证通过,根据用户id从数据库获取用户权限范围的u ...
- [原创]java WEB学习笔记01:javaWeb之tomcat的安装和配置
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Python3 函数 一
什么是函数? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal ...
- Spark MLlib框架详解
1. 概述 1.1 功能 MLlib是Spark的机器学习(machine learing)库,其目标是使得机器学习的使用更加方便和简单,其具有如下功能: ML算法:常用的学习算法,包括分类.回归.聚 ...