iOS15使用UIGraphicsImageRenderer导出SwiftUI图片出现异常顶部内边距 iOS14正常
问题原因
iOS 15 对 UIHostingController 的默认布局逻辑做了调整,在渲染未显式声明忽略安全区域的 SwiftUI 视图时,会自动为根视图叠加系统安全区域内边距,顶部异常留白实际是状态栏高度的安全区域占位。iOS 14 及更早版本的 UIHostingController 默认不会自动追加系统安全区域适配,所以相同代码运行正常。
可行解决方案
你可以通过以下修改修复异常内边距问题:
- 给待渲染的 SwiftUI 根视图添加
.ignoresSafeArea()修饰符,禁止视图自身预留安全区域位置 - iOS 15 及以上版本显式配置
UIHostingController的 sizing 规则,避免控制器自动根据屏幕安全区域调整视图尺寸 - 渲染前主动触发视图布局,确保尺寸符合预期
修复后参考代码
func exportViewToImage<T: View>(targetView: T, renderSize: CGSize) -> UIImage? { // 根视图主动忽略安全区域 let hosting = UIHostingController(rootView: targetView.ignoresSafeArea()) hosting.view.bounds = CGRect(origin: .zero, size: renderSize) // iOS15 专属适配配置 if #available(iOS 15.0, *) { hosting.sizingOptions = .preferredContentSize } hosting.view.layoutIfNeeded() let renderer = UIGraphicsImageRenderer(size: renderSize) return renderer.image { context in hosting.view.drawHierarchy(in: hosting.view.bounds, afterScreenUpdates: true) } }
内容的提问来源于stack exchange,提问作者Peacemoon
相关产品推荐
相关产品推荐

