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
相关产品推荐
相关产品推荐

