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

如何让UIView覆盖包含导航栏的整个屏幕?

解决方法:让半透明黑色视图覆盖整个屏幕(包括导航栏)

嘿,这个问题其实挺常见的——你现在把blackView加到了当前控制器的view上,但这个view本身是被导航栏遮挡住顶部的,自然没法覆盖导航栏。咱们直接从根源解决,把blackView加到应用的主窗口上,这样它就能铺满整个屏幕啦!

步骤1:获取当前应用的主窗口(适配iOS13+)

iOS13以后引入了多场景(Scene)概念,不能直接用旧的keyWindow写法,咱们用兼容的方式获取主窗口:

// 获取当前活跃的主窗口
guard let window = UIApplication.shared.connectedScenes
    .filter({ $0.activationState == .foregroundActive })
    .compactMap({ $0 as? UIWindowScene })
    .first?.windows
    .first(where: { $0.isKeyWindow }) else {
    return
}

步骤2:把blackView添加到窗口上并设置全屏约束

替换原来的view.addSubview(blackView),改成将视图加到窗口上,然后约束到窗口的四个边缘:

// 将blackView添加到主窗口
window.addSubview(blackView)
// 设置全屏约束(复用你原来的anchor方法,省略默认的0常量)
_ = blackView.anchor(window.topAnchor, left: window.leftAnchor, bottom: window.bottomAnchor, right: window.rightAnchor)

额外注意事项

  • 你的reminderPopUpView是加到blackView上的,所以不需要改动弹窗的代码,它会跟着blackView一起显示在最顶层。
  • 记得在弹窗关闭后,调用blackView.removeFromSuperview()把它从窗口上移除,避免内存泄漏。
  • 如果需要兼容iOS12及以下,可以保留旧写法作为 fallback:
// 兼容iOS12及以下版本
if #available(iOS 13.0, *) {
    // 上面的iOS13+窗口获取代码
} else {
    guard let window = UIApplication.shared.keyWindow else { return }
    window.addSubview(blackView)
    _ = blackView.anchor(window.topAnchor, left: window.leftAnchor, bottom: window.bottomAnchor, right: window.rightAnchor)
}

这样改完之后,你的半透明黑色视图就能完美覆盖包括导航栏在内的整个屏幕啦!

内容的提问来源于stack exchange,提问作者Osama Naeem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:04:41