IQKeyboardManager与Texture兼容问题

IQKeyboardManager是一个很方便的键盘弹出管理库,只需要一行代码即可自动管理键盘弹出遮挡输入框的问题,github上1w+星
Texture前身是AsyncDisplayKit,facebook出的异步渲染框架。

问题:

最近开始用IQKeyboardManager时,发现在UITextField或者UITextView上正常,并且有一个在键盘顶部的toolbar来控制前往上下一个输入框,配合一个done按钮来收回键盘,但是对于Texture的ASEditableTextNode这个toolbar缺无法展示,跟踪一下之后找到原因,记录一下。

方法:

添加个_ASDisplayView的分类,+(void)load时候试用methodswizzle交换方法:_IQcanBecomeFirstResponder,仅当self属于uitextview或者uitextfield的子类的时候,才返回YES。


_ASDisplayView+KeyboardManager.m

原因:

IQKeyboardManager版本:3.3.7
在IQKeyboardManager的IQKeyboardManager.m(Line:1586)中的addToolbarIfRequired方法添加toolbar之前会检测需要添加的textfield是否能响应方法setInputAccessoryView:,支持该方法才会插入toolbar。


addToolbarIfRequired

这个取出textfield方法是通过IQUIView+Hierarchy.m(Line:179)中的deepResponderViews方法递归去寻找当前视图栈中的textfield/textview


deepResponderViews

问题在_IQcanBecomeFirstResponder方法中:
_IQcanBecomeFirstResponder

仅仅通过
([self canBecomeFirstResponder] && [self isUserInteractionEnabled] && ![self isHidden] && [self alpha]!=0.0 && ![self isAlertViewTextField]  && ![self isSearchBarTextField])

来确定当前的view是输入框,但是对于Texture的ASEditableTextNode,他的view首先是:ASEditableTextNode-View(_ASDisplayView的一个运行时子类),在ASEditableTextNode-View的subviews中,才是真正所对应的两个uitextview的运行时子类:ASTextKitComponentsTextView(placeholder)与ASPanningOverriddenUITextView(text),因为ASEditableTextNode-View也能响应canBecomeFirstResponder与isUserInteractionEnabled,因此导致判断错误,所以只要在分类中返回正确条件就行。

你可能感兴趣的:(IQKeyboardManager与Texture兼容问题)