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

如何在iOS SwiftUI应用中实现图片点击打印功能?

在SwiftUI中实现图片点击打印功能

要在iOS SwiftUI应用中实现点击图片打印的功能,需要借助UIKit的UIPrintInteractionController(iOS官方提供的打印交互控制器),下面是完整的实现方案:

核心思路

  1. 让ViewModel异步下载图片并返回UIImage(避免阻塞UI线程)
  2. 在图片的点击回调中,初始化打印控制器并配置打印参数
  3. 通过当前的UIViewController弹出打印选择界面

完整代码示例

import SwiftUI

struct ImageView: View {
    @ObservedObject var viewModel: ImageViewModel
    
    var body: some View {
        Group {
            if let image = viewModel.downloadedImage {
                Image(uiImage: image)
                    .resizable()
                    .scaledToFit()
                    .onTapGesture {
                        printSelectedImage(image)
                    }
            } else {
                ProgressView("正在下载图片...")
            }
        }
        .onAppear {
            viewModel.downloadImage()
        }
    }
    
    private func printSelectedImage(_ image: UIImage) {
        // 初始化打印控制器
        let printController = UIPrintInteractionController.shared
        
        // 配置打印信息
        let printInfo = UIPrintInfo(dictionary: nil)
        printInfo.outputType = .photo // 按照片类型优化打印效果
        printInfo.jobName = "我的图片打印任务"
        printController.printInfo = printInfo
        
        // 设置要打印的内容
        printController.printingItem = image
        
        // 获取当前视图控制器用于弹出打印界面
        guard let rootViewController = UIApplication.shared.connectedScenes
                .compactMap({ $0 as? UIWindowScene })
                .first?.windows
                .first?.rootViewController else {
            print("无法获取视图控制器")
            return
        }
        
        // 弹出打印交互界面
        printController.present(from: .zero, in: rootViewController.view, animated: true) { _, isCompleted, error in
            if let error = error {
                print("打印失败:\(error.localizedDescription)")
            } else if isCompleted {
                print("打印已完成")
            }
        }
    }
}

// 示例ViewModel:异步下载图片
class ImageViewModel: ObservableObject {
    @Published var downloadedImage: UIImage?
    
    func downloadImage() {
        // 替换为你的图片下载URL
        guard let imageURL = URL(string: "https://example.com/your-image.jpg") else { return }
        
        URLSession.shared.dataTask(with: imageURL) { [weak self] data, _, error in
            guard let data = data, error == nil, let image = UIImage(data: data) else {
                print("图片下载失败")
                return
            }
            
            DispatchQueue.main.async {
                self?.downloadedImage = image
            }
        }.resume()
    }
}

关键说明

  • 异步下载:原代码中同步调用下载方法会阻塞UI,改用@Published属性配合异步下载,确保界面流畅
  • 打印配置:printInfo.outputType = .photo会针对照片打印优化色彩和分辨率,若打印文档类图片可改为.general
  • 视图控制器获取:通过UIApplication的场景和窗口获取根控制器,这是SwiftUI中调用UIKit模态界面的常用方式
  • 状态处理:在打印回调中处理失败和完成状态,方便调试和后续扩展用户提示逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:53:35