You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:55:06