如何在iOS SwiftUI应用中实现图片点击打印功能?
在SwiftUI中实现图片点击打印功能
要在iOS SwiftUI应用中实现点击图片打印的功能,需要借助UIKit的UIPrintInteractionController(iOS官方提供的打印交互控制器),下面是完整的实现方案:
核心思路
- 让ViewModel异步下载图片并返回
UIImage(避免阻塞UI线程) - 在图片的点击回调中,初始化打印控制器并配置打印参数
- 通过当前的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
相关产品推荐
相关产品推荐

