IQKeyboardManager遇到UIView的坑

坑,大坑

IQKeyboardManager很好用。 IQKeyboardManager繼承簡單。 IQKeyboardManager持續更新。bash

踩坑

最新很偶然的機會了解到IQKeyboardManager第三方庫,感受從各方面比較,都比我如今使用的TPKeyboardAvoiding好。因此果斷的替換。整個APP測試了一邊,感受不錯,徹底符合要求。直到5小時前,我開始編寫一個UITableView的UITableViewCell中嵌套UITextView,進行調試時,出現了崩潰的現象。app

SectionHeader
能夠從圖中看到,Section header view 好像沒有受到UITableView的改變而改變,一直停留在原來的位置。什麼鬼啊,直接無語。開始懷疑IQKeyboardManager沒有支持這樣的場景。下載Demo並在Demo修改UITableView的樣例,發現並不存在問題。

  • 又開始百度,Google的搜索問題,發現沒有人碰到過這個問題。
  • 而且在IQKeyboardManager的官網也沒有人描寫,那麼說明這個問題是我特有的。
  • 刪除設計到UIScrollview相關的第三方庫。 問題依然存在。
  • 刪除全部第三方庫。問題依然存在。
  • 清空工程,reset模擬器。 問題依然存在。
  • 新建一個空工程,複製相同的代碼,問題不在了。。。

緣由

應該仍是個人代碼的問題,開始篩選緣由吧。組件化

UITableViewWrapperView
在查看UI界面時,發現了一個奇怪的現象,UITableViewWrapperView爲什麼在鍵盤彈出後沒有改變。這個應該是問題所在。 可是面對上千個文件,怎麼進行查找啊。這個時候才如今組件化真的是頗有好處,直接按組件進行排查。^_^ 最後將問題定位在UIViewExtensions.h中,刪除這個文件後,問題被修復了。

#解決 發現原來UIViewExtensions類中的方法測試

- (UIView*) superviewOfClassType: (Class) classType
{
    UIView* view = self.superview;
    
    while (view != nil)
    {
        if ([view isKindOfClass: classType])
        {
            return view;
        }
        
        view = view.superview;
    }
    
    return nil;
}
複製代碼

與IQKeyboardManager庫中IQUIView+Hierarchy類重名了,也就是所說的覆蓋了。ui

-(UIView*)superviewOfClassType:(Class)classType
{
    UIView *superview = self.superview;
    
    while (superview)
    {
        if ([superview isKindOfClass:classType])
        {
            //If it's UIScrollView, then validating for special cases if ([superview isKindOfClass:[UIScrollView class]]) { NSString *classNameString = NSStringFromClass([superview class]); // If it's not UITableViewWrapperView class, this is internal class which is actually manage in UITableview. The speciality of this class is that it's superview is UITableView. // If it's not UITableViewCellScrollView class, this is internal class which is actually manage in UITableviewCell. The speciality of this class is that it's superview is UITableViewCell. //If it's not _UIQueuingScrollView class, actually we validate for _ prefix which usually used by Apple internal classes
                if ([superview.superview isKindOfClass:[UITableView class]] == NO &&
                    [superview.superview isKindOfClass:[UITableViewCell class]] == NO &&
                    [classNameString hasPrefix:@"_"] == NO)
                {
                    return superview;
                }
            }
            else
            {
                return superview;
            }
        }
        
        superview = superview.superview;
    }
    
    return nil;
}
複製代碼

其實分類的方法重名並不存在覆蓋的問題,只是在編譯的時候誰的方法在前,那麼誰的方法將會被執行。this

修改UIViewExtensions類中的方法後,顯示正常。 spa

正常嘍

查看鍵盤彈出的UI界面能夠清楚的看到,UITableViewWrapperView在鍵盤彈出後向上縮進,避免鍵盤所在的部分被覆蓋。設計

UITableViewWrapperView正常

仍是但願IQKeyboardManager可以模仿AFNetworking或SDWebImage使用本身的前綴,避免這樣的問題再次出現。3d

// END調試

相關文章
相關標籤/搜索