适配iPad的App在macOS运行时打印报错的代码修改咨询
解决macOS「Designed for iPad」模式下打印控制器报错问题
问题原因
报错CGContextClipToRect: invalid context 0x0的核心原因是:代码中创建了一个未挂载到应用视图层级的空UIViewController,而在macOS的iPad兼容模式下,UIPrintInteractionController需要一个已关联到视图层级的有效父控制器才能正确初始化绘图上下文,空控制器无法提供合法的上下文环境,导致报错。
修改方案
直接使用当前应用的根视图控制器作为打印控制器的父上下文,避免创建空控制器。具体修改如下:
import SwiftUI struct ContentView: View { var body: some View { VStack { Button("print"){ prt() } } .padding() } func prt(){ let htmlString = "<h1>Hello World</h1>" let formatter: UIMarkupTextPrintFormatter = UIMarkupTextPrintFormatter(markupText: htmlString) let printInfo = UIPrintInfo(dictionary: nil) printInfo.jobName = "test" printInfo.outputType = .general let printController = UIPrintInteractionController.shared printController.printInfo = printInfo printController.showsNumberOfCopies = true printController.printFormatter = formatter DispatchQueue.main.async { // 获取当前应用的根视图控制器,确保有有效的上下文 guard let rootVC = UIApplication.shared.windows.first?.rootViewController else { print("无法获取有效视图控制器") return } // 使用带视图上下文的present方法 printController.present(from: rootVC.view.bounds, in: rootVC.view, animated: true, completionHandler: { _, _, _ in printController.printFormatter = nil }) } } }
关键改动说明
- 移除了空的
UIViewController实例创建代码 - 通过
UIApplication.shared.windows.first?.rootViewController获取当前应用的根视图控制器,确保父控制器处于活跃的视图层级中 - 改用
present(from:in:animated:completionHandler:)方法,传入根控制器的视图边界和视图实例,为打印控制器提供合法的绘图上下文
内容的提问来源于stack exchange,提问作者Andreas Stokidis
相关产品推荐
相关产品推荐

