Swift版本:5.4.2
Xcode版本:12.5.1
真机iOS版本 : 14.7
IQKeyboardManager版本 6.5.5
模拟器版本:14.5
真机上不正常,模拟器正常(!!!!!),推测可能跟系统版本有关。
先说一下解决方案:在ViewController 的viewDidLoad()方法中增加代码
IQKeyboardManager.shared().isEnableAutoToolbar = false
viewWillDisappear ()方法中
IQKeyboardManager.shared().isEnableAutoToolbar = true
------------------------解释
IQKeyboardManager 源码IQKeyboardManager.m 中663行adjustPosition方法中,第674行有这么一句代码
if (_hasPendingAdjustRequest == NO ||
textFieldView == nil ||
rootController == nil ||
keyWindow == nil)
return;
如果_rootViewController是nil(断点调试显示其他几项均为true),则不会继续往下执行,即不再走调整父view坐标代码,继而出现键盘遮挡问题。
问题转换为为什么_rootViewController = nil ?
接着在1266行restorePosition方法中最后有这么一句代码
_rootViewController = nil;
且搜索发现只有这一处发现_rootViewController = nil;情况。
此时点击输入框时在此处断点,发现一个调用链方法-(void)textFieldViewDidBeginEditing:(NSNotification*)notification 方法中1603行代码
[strongSelf.textFieldView reloadInputViews];
会触发- (void)keyboardWillHide:(NSNotification*)aNotification方法,
在1529行调用1266行的restorePosition方法,最后执行_rootViewController = nil;
而1603行代码触发的条件是 [self privateIsEnableAutoToolbar],指向了一个属性
enableAutoToolbar,文档对其的解释是
/**
Automatic add IQToolbar functionality. Default is YES.
*/
默认值是true,如果我们将其关闭,则不会触发上述代码,那么这个问题是不是就可以暂时这么解决了呢?答案是可以。
至此IQKeyboardManager 失效原因的源码断点调试过程就是这样。至于是不是系统原因还有待考证。以上均为断点调试结果,尚未深入框架原理,理解上可能有失偏颇,有了解框架原理的可以试试从底层找找原因,欢迎交流