IQKeyboardManager在Swift项目中完全失效问题排查求助
问题
接手维护一个使用IQKeyboardManager的项目,这个库本该表现稳定,但现在完全失效。触发键盘时,顶部标题栏被向上推,屏幕仅底部2%区域能显示内容,只能看到Done工具栏。已知视图都是滚动视图/UIView/UITextView,理论上不该有这个问题。另外不清楚标题栏被推高的原因,但这是功能恢复后的次要问题,想知道怎么解决,有没有更新的替代库?
调试日志
IQKeyboardManager| ⌨️>>>>>> keyboardWillHide(_:) started >>>>>> IQKeyboardManager| | Notification Object:<UIScreen: 0x7f9519d04a40; bounds: {{0, 0}, {393, 852}}; mode: <UIScreenMode: 0x6000029f3fa0; size = 1179.000000 x 2556.000000>> IQKeyboardManager| ⌨️<<<<<< keyboardWillHide(_:) ended: 0.00040386100590694696 seconds <<<<<<< IQKeyboardManager| ⌨️>>>>>> keyboardDidHide(_:) started >>>>>> IQKeyboardManager| | Notification Object:<UIScreen: 0x7f9519d04a40; bounds: {{0, 0}, {393, 852}}; mode: <UIScreenMode: 0x6000029f3fa0; size = 1179.000000 x 2556.000000>> IQKeyboardManager| ⌨️<<<<<< keyboardDidHide(_:) ended: 8.349800191354007e-05 seconds <<<<<<< IQKeyboardManager| UIKeyboard Frame: (0.0, 808.0, 393.0, 119.0) IQKeyboardManager| ⌨️>>>>>> keyboardWillShow(_:) started >>>>>> IQKeyboardManager| | Notification Object:<UIScreen: 0x7f9519d04a40; bounds: {{0, 0}, {393, 852}}; mode: <UIScreenMode: 0x6000029f3fa0; size = 1179.000000 x 2556.000000>> IQKeyboardManager| | Saving <YACHT_NOW.ChatRoomView: 0x7f9518847e00> beginning origin: (0.0, 0.0) IQKeyboardManager| ⌨️<<<<<< keyboardWillShow(_:) ended: 0.0001746119960444048 seconds <<<<<<< IQKeyboardManager| >>>>>> adjustPosition() started >>>>>> IQKeyboardManager| | Need to move: 26.0 IQKeyboardManager| | Moving Upward IQKeyboardManager| | Set <YACHT_NOW.ChatRoomView: 0x7f9518847e00> origin to: (0.0, -26.0) IQKeyboardManager| <<<<<<< adjustPosition() ended: 0.0005378810019465163 seconds <<<<<<< IQKeyboardManager| ⌨️>>>>>> keyboardDidShow(_:) started >>>>>> IQKeyboardManager| | Notification Object:<UIScreen: 0x7f9519d04a40; bounds: {{0, 0}, {393, 852}}; mode: <UIScreenMode: 0x6000029f3fa0; size = 1179.000000 x 2556.000000>> IQKeyboardManager| ⌨️<<<<<< keyboardDidShow(_:) ended: 0.00013294999371282756 seconds <<<<<<< IQKeyboardManager| >>>>>> adjustPosition() started >>>>>> IQKeyboardManager| | Need to move: 0.0 IQKeyboardManager| <<<<<<< adjustPosition() ended: 6.623199442401528e-05 seconds <<<<<<< IQKeyboardManager| ⌨️>>>>>> keyboardWillHide(_:) started >>>>>> IQKeyboardManager| | Notification Object:<UIScreen: 0x7f9519d04a40; bounds: {{0, 0}, {393, 852}}; mode: <UIScreenMode: 0x6000029f3fa0; size = 1179.000000 x 2556.000000>> IQKeyboardManager| | Restoring <YACHT_NOW.ChatRoomView: 0x7f9518847e00> origin to: (0.0, 0.0) IQKeyboardManager| ⌨️<<<<<< keyboardWillHide(_:) ended: 0.00037055999564472586 seconds <<<<<<< IQKeyboardManager| 📝>>>>>> textFieldViewDidEndEditing(_:) started >>>>>> IQKeyboardManager| | Notification Object:<YACHT_NOW.CustomChatTextField: 0x7f951a09f600; baseClass = UITextView; frame = (10 6; 244 30); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x6000026dcfc0>>; backgroundColor = <UIDynamicSystemColor: 0x600003cb61c0; name = systemBackgroundColor>; layer = <CALayer: 0x600002951b80>; contentOffset: {0, 0.33333333333333331}; contentSize: {244, 33}; adjustedContentInset: {0, 0, 0, 0}> IQKeyboardManager| 📝<<<<<< textFieldViewDidEndEditing(_:) ended: 0.00011827600246760994 seconds <<<<<<< IQKeyboardManager| ⌨️>>>>>> keyboardDidHide(_:) started >>>>>> IQKeyboardManager| | Notification Object:<UIScreen: 0x7f9519d04a40; bounds: {{0, 0}, {393, 852}}; mode: <UIScreenMode: 0x6000029f3fa0; size = 1179.000000 x 2556.000000>> IQKeyboardManager| ⌨️<<<<<< keyboardDidHide(_:) ended: 0.00021278900385368615 seconds <<<<<<<
聊天功能相关代码
extension ChatRoomView : UITextViewDelegate { func textViewDidBeginEditing(_ textView: UITextView) { if textView.text == "Type here" { textView.text = "" //textView.textColor = UIColor.darkGray } } func textViewDidEndEditing(_ textView: UITextView) { if textView.text.isEmpty { textView.text = "Type here" //textView.textColor = UIColor.lightGray } } }
解决方案
针对IQKeyboardManager的修复步骤
- 更新库版本:先确认当前使用的IQKeyboardManager版本是否过时,更新到最新稳定版,多数布局问题在新版本中已修复。
- 单独配置当前页面:关闭全局管理,在ChatRoomView中单独启用,避免全局配置冲突:
override func viewDidLoad() { super.viewDidLoad() IQKeyboardManager.shared.enable = false IQKeyboardManager.shared.enable(for: self) } - 调整核心配置:指定库不要移动导航栏,同时设置合理的键盘与输入框间距:
IQKeyboardManager.shared.shouldResignOnTouchOutside = true IQKeyboardManager.shared.keyboardDistanceFromTextField = 10 - 检查视图层级与约束:确保ChatRoomView的根视图是UIScrollView或包含UIScrollView,且Auto Layout约束无冲突。从日志看,库直接移动了ChatRoomView的origin,说明它未识别到内部滚动视图,可手动给textView设置
inputAccessoryView替代自动工具栏,避免整体视图偏移。 - 排除代理干扰:暂时注释掉当前UITextViewDelegate的实现代码,测试是否是代理逻辑干扰了库的正常工作。
替代方案
如果IQKeyboardManager无法修复,可选择以下方案:
- 原生适配:利用UIScrollView的
keyboardDismissMode和contentInsetAdjustmentBehavior,结合键盘通知手动调整滚动视图的contentInset,无需第三方库,稳定性更高。 - KeyboardLayoutGuide:iOS 11+原生提供的布局指南,通过Auto Layout约束将视图绑定到键盘上方,代码简洁适配性好。
- TPKeyboardAvoiding:轻量级替代库,专注滚动视图的键盘适配,逻辑简单易排查问题。
内容的提问来源于stack exchange,提问作者Zach Handley
相关产品推荐
相关产品推荐

