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

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)是否和标签物理尺寸比例一致。如果比例不匹配,即使设置了正确纸张,也会出现拉伸或留白,建议根据实际标签宽高比调整该尺寸。

验证步骤
  1. 运行修改后的代码,打印日志查看printableRect是否回到iOS17时的尺寸范围。
  2. 测试打印,确认标签内容缩放正常,无过度放大情况。
  3. 如果问题仍存在,可尝试获取打印机支持的纸张尺寸,匹配后替换自定义尺寸:
printer.supportedPapers { papers in
    for paper in papers {
        print("支持的纸张尺寸: \(paper.size)")
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:24:54