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调试

相关文章
相关标签/搜索