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
相关产品推荐
相关产品推荐

