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

iOS 13下present半透明背景UIViewController变全黑,已设样式求助

嘿,这个问题我之前做项目时也踩过坑!iOS 13之后苹果对模态视图的默认渲染逻辑有调整,导致你设置的半透明背景失效变成纯黑,给你几个亲测有效的解决办法:

1. 确保目标VC的视图本身是半透明的

这是最基础但容易漏的点:你要present的那个UIViewController,它的view必须是半透明的,而且不能处于不透明状态。在它的viewDidLoad里加上这些代码:

// 设置你想要的半透明背景色,这里以50%透明度的黑色为例
self.view.backgroundColor = UIColor.black.withAlphaComponent(0.5)
// 务必确保视图不是不透明的,默认是false,但如果手动改过要改回来
self.view.isOpaque = false
2. 检查模态样式的设置对象和顺序

你已经设置了modalTransitionStyle和modalPresentationStyle,但要注意这些属性是要设置在你要present的那个VC上,而不是发起present的VC!正确的写法示例:

let yourTransparentVC = YourCustomViewController()
// 先给目标VC设置样式
yourTransparentVC.modalTransitionStyle = .crossDissolve
yourTransparentVC.modalPresentationStyle = .overFullScreen
// 再执行present操作
self.present(yourTransparentVC, animated: true)

如果是用Storyboard创建的VC,记得在Storyboard的属性检查器里,把Modal Presentation设置为Over Full Screen,避免代码设置被Storyboard的配置覆盖。

3. 移除系统自动添加的黑色背景容器

iOS 13之后,系统会给模态VC自动添加一个容器视图,默认是黑色的。如果前面两步都做了还是黑背景,可以尝试在目标VC的viewDidAppear(_:)里手动清空这个容器的背景色:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // 获取模态presentation控制器的容器视图,设置背景为透明
    presentationController?.containerView?.backgroundColor = .clear
}
4. 特殊情况:从导航/标签控制器present

如果你是从UINavigationController或者UITabBarControllerpresent的模态VC,要注意这些容器控制器的默认模态样式是pageSheet,可能会影响半透明效果。这时候可以二选一:

  • 临时修改容器控制器的模态样式后再present
navigationController?.modalPresentationStyle = .overFullScreen
navigationController?.present(yourTransparentVC, animated: true)
  • 直接用当前显示的子VC来发起present操作
self.present(yourTransparentVC, animated: true)

按照上面的步骤来,基本就能解决半透明背景变黑的问题啦!

内容的提问来源于stack exchange,提问作者蔡Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:14:15