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

