SystemUiMode.immersiveSticky失效问题及iOS状态栏设置咨询
Android 端 SystemUiMode.immersiveSticky 失效问题解决
核心原因
键盘弹出/收起这类焦点变化操作会触发系统UI的重置逻辑,导致沉浸式状态被打破。
解决办法
监听布局变化,自动恢复沉浸式模式
注册OnGlobalLayoutListener监听布局高度变化(对应键盘弹出/收起动作),在回调中重新设置沉浸式参数:view.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { if (shouldKeepImmersive) { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) } } })注意在页面销毁前移除监听器,避免内存泄漏。
重写窗口焦点变化方法
当窗口焦点重新获取时,强制恢复沉浸式状态:override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus && shouldKeepImmersive) { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) } }多节点触发设置逻辑
不要仅在onCreate或onResume中设置一次,在键盘状态变化、页面恢复、焦点切换等可能导致UI重置的节点,都执行沉浸式模式的设置代码。
iOS 端类似沉浸式功能实现
iOS没有和immersiveSticky完全匹配的API,但可以通过以下配置实现接近的全屏沉浸式效果:
隐藏状态栏与底部Home Indicator
隐藏状态栏
两种实现方式:- 在Info.plist中添加
UIStatusBarHidden设为YES,同时设置UIViewControllerBasedStatusBarAppearance为NO; - 在ViewController中重写属性:
override var prefersStatusBarHidden: Bool { return true } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .fade }
- 在Info.plist中添加
自动隐藏Home Indicator(刘海屏设备)
重写ViewController的对应属性,实现无操作时自动隐藏、点击屏幕时临时显示的效果,和immersiveSticky行为一致:override var prefersHomeIndicatorAutoHidden: Bool { return true }
键盘收起后的状态保持
iOS键盘弹出不会直接重置状态栏状态,若需确保键盘收起后沉浸式状态稳定,可监听键盘隐藏通知并触发状态更新:
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardHide), name: UIKeyboardWillHideNotification, object: nil) @objc func onKeyboardHide() { setNeedsStatusBarAppearanceUpdate() view.setNeedsLayout() }
内容的提问来源于stack exchange,提问作者binyamin alony
相关产品推荐
相关产品推荐

