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

iPad应用指定打印机多次打印时页面顶部出现4cm空白

iPad 打印重复调用后顶部出现额外空白的问题解决

问题现象

  • 多次点击自定义打印按钮打印同一页面时,页面顶部会出现4cm的额外空白区域。
  • 当printerURL为nil时,多次打印无异常,但每次会弹出打印选择窗口;若已设置printerURL,从第二次打印开始就会出现顶部空白问题。

问题原因

UIPrintInteractionController.shared是单例对象,重复使用该单例直接调用print(to:)方法时,之前打印的布局状态(比如边距、纸张设置)会残留,导致后续打印出现布局偏移。而调用present()方法时,系统会自动重置单例的状态,所以不会出现问题。

解决方案

每次打印时创建新的UIPrintInteractionController实例,而非复用全局单例,避免状态残留影响后续打印。

修改后的代码

public var printerURL: URL?
override func viewWillAppear(_ animated: Bool) {
    if let savedPrinterURL = UserDefaults.standard.url(forKey: "PrinterURL") {
        printerURL = savedPrinterURL
    }
}

@IBAction func btnPrinterPressed(_ sender : UIButton) {
    self.printRightAway(url: "\(appUrl.url)\(vPK!)", success: { bool in
        if bool { self.hideSimpleHUD() }
    })
}

func printRightAway(url: String, success:@escaping (Bool) -> Void) {
    AF().DOWNLOAD(url, success: { response, bool, message in
        guard bool, UIPrintInteractionController.canPrint(response) else {
            success(false)
            SharedClass.sharedInstance.alert(view: self, message: "发生错误\n\(message)".localized)
            return
        }
        
        // 创建新的打印控制器实例,而非复用单例
        let printController = UIPrintInteractionController()
        let printInfo = UIPrintInfo(dictionary: nil)
        printInfo.jobName = response.lastPathComponent
        printInfo.outputType = .photo
        printInfo.orientation = .portrait
        
        printController.printInfo = printInfo
        printController.showsNumberOfCopies = true
        printController.showsPaperSelectionForLoadedPapers = true
        printController.printingItem = response
        
        if let printerURL = UserDefaults.standard.url(forKey: "PrinterURL") {
            let printer = UIPrinter(url: printerURL)
            printController.print(to: printer, completionHandler: { controller, success, error in
                if success {
                    debugPrint("打印完成。")
                } else {
                    debugPrint("打印失败。")
                }
            })
        } else {
            printController.present(animated: true, completionHandler: nil)
        }
        
        success(true)
    }) { error, message in
        SharedClass.sharedInstance.alert(view: self, message: "发生错误\n\(message)".localized)
        print("KO: \(error)")
        success(false)
    }
}

关键修改点

将原来的let printController = UIPrintInteractionController.shared替换为let printController = UIPrintInteractionController(),每次打印都创建新的实例,彻底避免单例状态残留导致的布局问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:49:59