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

iOS 11.3集成IQKeyboardManager后状态栏背景颜色异常问题

解决方案:IQKeyboardManager导致键盘收起后状态栏背景异常

这种状态栏背景异常的问题我之前也碰到过,大概率是IQKeyboardManager自动调整视图层级或安全区域时,和你项目里的状态栏、导航栏配置产生了冲突。结合你已经尝试过的方法,给你几个额外的可行方案:

1. 强制刷新状态栏外观

IQKeyboardManager在调整视图后可能没有触发状态栏样式的更新,你可以监听键盘收起的通知,手动强制刷新:

override func viewDidLoad() {
    super.viewDidLoad()
    // 添加键盘收起通知监听
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(onKeyboardWillHide),
        name: UIResponder.keyboardWillHideNotification,
        object: nil
    )
}

@objc private func onKeyboardWillHide() {
    // 强制状态栏更新
    setNeedsStatusBarAppearanceUpdate()
    // 如果是背景颜色异常,也可以手动重置状态栏背景(如果你的项目有自定义状态栏背景的话)
    if let statusBarView = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView {
        statusBarView.backgroundColor = .yourExpectedColor // 替换成你需要的颜色
    }
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

2. 调整IQKeyboardManager的安全区域和状态栏相关配置

除了canAdjustAdditionalSafeAreaInsets,你还可以尝试禁用它对状态栏的自动调整,或者调整其他相关属性:

// 在AppDelegate或当前VC的viewDidLoad中设置
IQKeyboardManager.shared.enableAutoToolbar = false // 禁用自动工具栏,避免布局冲突
IQKeyboardManager.shared.shouldShowToolbarPlaceholder = false
IQKeyboardManager.shared.isEnable = true
// 尝试关闭安全区域自动调整,改用手动适配
IQKeyboardManager.shared.canAdjustAdditionalSafeAreaInsets = false

3. 检查导航栏的半透明属性

如果你的页面使用了导航栏,半透明属性可能和IQKeyboardManager的布局调整冲突。可以在当前视图控制器中临时修改导航栏的半透明设置:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // 根据你的需求设置,false会让导航栏不透明,避免和安全区域叠加
    navigationController?.navigationBar.isTranslucent = false
    // 同时设置导航栏背景色,确保和状态栏颜色匹配
    navigationController?.navigationBar.backgroundColor = .yourNavigationBarColor
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // 离开页面时恢复原来的设置(如果其他页面需要半透明)
    navigationController?.navigationBar.isTranslucent = true
}

4. 临时禁用当前VC的IQKeyboardManager自动调整

如果以上方法都无效,可以尝试在当前视图控制器中禁用IQKeyboardManager的自动处理,改用手动适配键盘:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // 禁用当前VC的IQKeyboardManager
    IQKeyboardManager.shared.disabledDistanceHandlingClasses = [Self.self]
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // 恢复全局设置
    IQKeyboardManager.shared.disabledDistanceHandlingClasses.removeAll()
}

然后按照常规的键盘通知监听方法,手动调整scrollView的contentInset来避免输入框被遮挡(逻辑可参考方案1中的键盘监听代码)。

内容的提问来源于stack exchange,提问作者Anilkumar iOS Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:51:58