You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配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
            })
        }
    }
}

关键改动说明

  1. 移除了空的UIViewController实例创建代码
  2. 通过UIApplication.shared.windows.first?.rootViewController获取当前应用的根视图控制器,确保父控制器处于活跃的视图层级中
  3. 改用present(from:in:animated:completionHandler:)方法,传入根控制器的视图边界和视图实例,为打印控制器提供合法的绘图上下文

内容的提问来源于stack exchange,提问作者Andreas Stokidis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:16:14