模态呈现UIPageViewController时透明度仅短暂生效问题求助
解决UIPageViewController模态转场后透明度失效的思路
修正模态展示样式设置
必须将modalPresentationStyle设为.overCurrentContext或.overFullScreen,禁止使用.fullScreen——因为.fullScreen会移除原视图控制器的视图,直接导致透明效果失效。在转场准备代码中设置:if let pageVC = segue.destination as? UIPageViewController { pageVC.modalPresentationStyle = .overCurrentContext pageVC.modalTransitionStyle = .coverVertical // 可根据需求替换转场样式 }注意iOS 13+版本下,当前发起转场的视图控制器需要设置
definesPresentationContext = true,否则.overCurrentContext可能不生效。调整背景设置的时机与层级
将UIPageViewController的背景设为.clear,子控制器的背景设为深灰色(透明度0.98),且子控制器的背景设置要放在viewWillAppear(_:)中,而非viewDidLoad()——因为转场完成后视图层级可能会刷新,覆盖viewDidLoad中的配置:// 子控制器代码 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) view.backgroundColor = UIColor.darkGray.withAlphaComponent(0.98) } // UIPageViewController代码 override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .clear }禁用系统自动背景调整
UIPageViewController可能会根据系统样式自动修改背景,在UIPageViewController中添加以下代码关闭该行为:override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .clear if #available(iOS 13.0, *) { overrideUserInterfaceStyle = .light // 按需设置,避免系统自动篡改背景 } }排查视图层级中的干扰视图
转场完成后,在UIPageViewController的viewDidAppear(_:)中打印视图层级,检查是否存在系统自动添加的不透明背景视图:override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print(view.subviews) }如果发现无关的背景视图,直接将其设为透明:
for subview in view.subviews { if subview.backgroundColor != nil && subview != view.subviews.first { subview.backgroundColor = .clear } }
内容的提问来源于stack exchange,提问作者Lena Verhoev
相关产品推荐
相关产品推荐

