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

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

  • 隐藏状态栏
    两种实现方式:

    1. 在Info.plist中添加UIStatusBarHidden设为YES,同时设置UIViewControllerBasedStatusBarAppearance为NO;
    2. 在ViewController中重写属性:
      override var prefersStatusBarHidden: Bool {
          return true
      }
      override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
          return .fade
      }
      
  • 自动隐藏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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:41:31