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

