Swift版本:5.4.2
Xcode版本:12.5.1
真機(jī)iOS版本 : 14.7
IQKeyboardManager版本 6.5.5
模擬器版本:14.5
真機(jī)上不正常,模擬器正常(D彀凇!!!!)锭沟,推測可能跟系統(tǒng)版本有關(guān)。
先說一下解決方案:在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(斷點調(diào)試顯示其他幾項均為true),則不會繼續(xù)往下執(zhí)行族淮,即不再走調(diào)整父view坐標(biāo)代碼,繼而出現(xiàn)鍵盤遮擋問題凭涂。
問題轉(zhuǎn)換為為什么_rootViewController = nil 祝辣?
接著在1266行restorePosition方法中最后有這么一句代碼
_rootViewController = nil;
且搜索發(fā)現(xiàn)只有這一處發(fā)現(xiàn)_rootViewController = nil;情況。
此時點擊輸入框時在此處斷點切油,發(fā)現(xiàn)一個調(diào)用鏈方法-(void)textFieldViewDidBeginEditing:(NSNotification*)notification 方法中1603行代碼
[strongSelf.textFieldView reloadInputViews];
會觸發(fā)- (void)keyboardWillHide:(NSNotification*)aNotification方法较幌,
在1529行調(diào)用1266行的restorePosition方法,最后執(zhí)行_rootViewController = nil;
而1603行代碼觸發(fā)的條件是 [self privateIsEnableAutoToolbar]白翻,指向了一個屬性
enableAutoToolbar,文檔對其的解釋是
/**
Automatic add IQToolbar functionality. Default is YES.
*/
默認(rèn)值是true,如果我們將其關(guān)閉绢片,則不會觸發(fā)上述代碼滤馍,那么這個問題是不是就可以暫時這么解決了呢?答案是可以底循。
至此IQKeyboardManager 失效原因的源碼斷點調(diào)試過程就是這樣巢株。至于是不是系統(tǒng)原因還有待考證。以上均為斷點調(diào)試結(jié)果熙涤,尚未深入框架原理阁苞,理解上可能有失偏頗,有了解框架原理的可以試試從底層找找原因祠挫,歡迎交流????