iOS15系统下UIActivityViewController弹出后显示空白透明问题求助
问题原因
该问题是iOS 15系统对系统组件外观继承逻辑调整导致的:
- iOS 15 及以上版本中,
UIActivityViewController默认会继承当前弹出它的视图控制器的所有外观配置,如果你全局设置了UIView默认背景为透明、或者自定义了全局导航栏外观,就会导致UIActivityViewController的背景层没有正常渲染,出现透明问题。 - 其他自定义视图控制器弹出正常,是因为你在自定义控制器中主动设置了背景色,不受全局外观配置的影响。
解决方案
方案1(最优,保留系统原生毛玻璃效果)
排查全局外观配置代码,排除对UIActivityViewController内部视图的影响:
如果你的项目中有类似全局设置UIView背景的代码:
// 旧的全局配置代码,会影响所有系统组件 UIView.appearance().backgroundColor = .clear
修改为仅对自定义视图生效,排除系统组件:
UIView.appearance(whenContainedInInstancesOf: [YourCustomViewController.self]).backgroundColor = .clear
方案2(兼容旧代码,快速修复)
如果不想调整全局配置,可以在弹出UIActivityViewController时主动指定外观,不要直接设置view.backgroundColor(会破坏系统原生毛玻璃效果),推荐设置如下:
@objc func shareButtonTapped() { guard let svc = self.findViewController() else { return } let vc = UIActivityViewController(activityItems: ["www.apple.com"], applicationActivities: nil) // iOS15+ 单独适配 if #available(iOS 15.0, *) { // 优先继承系统界面样式,不受当前页面自定义外观影响 vc.overrideUserInterfaceStyle = .unspecified // 如果仍有透明问题,再设置popover背景色 if let pop = vc.popoverPresentationController { pop.backgroundColor = .systemBackground pop.sourceView = someView pop.sourceRect = shareButton.frame } } else { if let pop = vc.popoverPresentationController { pop.sourceView = someView pop.sourceRect = shareButton.frame } } svc.present(vc, animated: true) }
额外优化建议
建议不要在UICollectionViewCell中直接处理弹出控制器逻辑,最好把分享按钮的点击事件通过代理或者闭包回调到上层的视图控制器(比如当前的相册预览控制器)中执行弹出操作,避免findViewController()查找层级异常导致的其他系统组件兼容问题。
内容的提问来源于stack exchange,提问作者mczmma
相关产品推荐
相关产品推荐

