iOS 18中AirPrint打印标签缩放异常(iOS17正常)问题咨询
问题分析
从你提供的打印参数能明显看到:iOS 18下的paperRect和adjustedPrintableRect尺寸是iOS 17的3倍左右,这直接导致标签图片被拉伸到过大的打印区域,出现缩放过度问题。根源在于iOS 18对AirPrint的纸张尺寸处理逻辑发生变化,系统自动匹配的默认纸张不再是你需要的标签尺寸,而是切换成了A4这类标准大纸张。
解决方案
1. 强制指定自定义纸张尺寸
在AirprintLabelRenderer中手动设置与标签匹配的纸张和可打印区域,覆盖系统默认值:
class AirprintLabelRenderer: UIPrintPageRenderer { private let imagesToRender: [UIImage] // 复用iOS17下的正确纸张尺寸作为基准 private let customPaperRect = CGRect(x: 0, y: 0, width: 266.51338582677164, height: 175.748031496063) private let customPrintableRect = CGRect(x: 8.588976377952747, y: 4.365354330708661, width: 249.33543307086615, height: 167.01732283464568) init(imagesToRender: [UIImage]) { self.imagesToRender = imagesToRender super.init() // 通过KVC覆盖系统默认的纸张和可打印区域 self.setValue(customPaperRect, forKey: "paperRect") self.setValue(customPrintableRect, forKey: "printableRect") } override var numberOfPages: Int { return imagesToRender.count } override func drawPage(at pageIndex: Int, in printableRect: CGRect) { let image = imagesToRender[pageIndex] // 计算等比例缩放后的绘制区域,避免拉伸变形 let scale = min(printableRect.width / image.size.width, printableRect.height / image.size.height) let drawSize = CGSize(width: image.size.width * scale, height: image.size.height * scale) let drawRect = CGRect( x: printableRect.midX - drawSize.width/2, y: printableRect.midY - drawSize.height/2, width: drawSize.width, height: drawSize.height ) image.draw(in: drawRect) } }
2. 调整打印信息配置
修改buildPrinterInfo方法,替换照片模式输出类型,避免照片打印的特殊缩放逻辑干扰:
private func buildPrinterInfo() -> UIPrintInfo { let printInfo = UIPrintInfo.printInfo() printInfo.outputType = .general // 替换原有的.photoGrayscale printInfo.jobName = "AirPrint" printInfo.orientation = .landscape printInfo.duplex = .none return printInfo }
3. 核对图片生成比例
检查buildItem中生成图片的尺寸CGSize(width: 550, height: 420)是否和标签物理尺寸比例一致。如果比例不匹配,即使设置了正确纸张,也会出现拉伸或留白,建议根据实际标签宽高比调整该尺寸。
验证步骤
- 运行修改后的代码,打印日志查看
printableRect是否回到iOS17时的尺寸范围。 - 测试打印,确认标签内容缩放正常,无过度放大情况。
- 如果问题仍存在,可尝试获取打印机支持的纸张尺寸,匹配后替换自定义尺寸:
printer.supportedPapers { papers in for paper in papers { print("支持的纸张尺寸: \(paper.size)") } }
内容的提问来源于stack exchange,提问作者Chirag Shah
相关产品推荐
相关产品推荐

