当前位置:首页 > 在iOS上使用AirPrint实现无线打印功能
内容
1, 什么是AirPrint
?
其实就是将iOS(iphone,ipad)上的内容,使用支持AirPrint的打印机打印出来。打印过程无线控制,非常方便。 2, 第一手资料
?
学习iOS, 第一手资料肯定非苹果官方文档莫属.
here。(我下面叙述的内容基本上是对文档的总结,英语可以的建议直接看文档。。。)
3, Printer Simulator,使用打印模拟器进行测试
?
既然涉及打印功能,那么就需要有一台支持AirPrint功能的打印机进行测试喽,你没有?没关系!苹果已经为我们准备好了模拟器。这个模拟器在Xcode中没有,需要自己到官网下载:
下载Printer Simulator (需要先注册登录)
4, 了解一下AirPrint可以打印的内容
1. an array of ready-to-print images and PDF documents: 一组图片文件和PDF文件。 2. a single image or PDF document:一张图片或是一个pdf文件。、
3. an instance of any of the built-in print formatter classes: 打印格式化者的实例。(简单文本,html文档,某些View显示的内容)。 4. a custom page renderer:自定义页渲染者。
注释: 1,2 很简单,就不详细解释了,3,4姑且这样翻译了,不懂没关系,继续向下看。。。 5, 关于AirPrint的API
?
AirPrint的api包含 eight classes and one protocol。下图是它们之间的关系。(下面这张图明白了,那你基本就掌握了)。
UIPrintInteractionController属性: 1. UIPrintInfo *printInfo: 打印任务的信息。 2. UIPrintPaper * printPaper : 打印内容的区域。
3. delegate:遵守UIPrintInteractionControllerDelegate协议的代理。
4. 最重要的就是制定需要打印的内容:printingItem,printingItems,printFormatter,printPageRenderer。四个属性都是用来指定要打印的内容的。这四个参数是互斥的,也就是说只要一个赋值,其他三个参数就得是nil. 很容易理解,一个打印任务,不能同时干多个活呀。这里如果使用 swift的枚举,就很容易理解了。 这里提到的四个关于内容的属性,和第4 点是关联起来的。下面这张表是对应关系:
6,打印流程
1. 创建UIPrintInteractionController实例。
2. 创建UIPrintInfo实例。并配置参数 output type(输出类型), print orientation(打印方向), job name(打印工作标识),然后赋值给UIPrintInteractionController实例的printInfo属性。 3. 给delegate 属性赋值,赋的值必须遵守UIPrintInteractionControllerDelegate协议。这个代理可以响应 printing options界面的显示和消失,打印工作的开始和结束等。 4. 指定要打印的内容。也就是指定printingItem,printingItems,printFormatter,printPageRenderer. 参数的其中一个。
5. 当你使用printPageRenderer. 时情况会复杂一些。你可以绘制每一页的header, footer, 内容。这是你需要自己计算页数。另外,你也可以创建一个或多个UIPrintFormatter实例,通过addPrintFormatter:startingAtPageAtIndex: 或者printFormatters参数赋值给printPageRenderer.实例。这种情况下不需要自己计算多少页。 6. 最后就是显示显示出printing options 界面了。方法:
在iPad上: presentFromBarButtonItem:animated:completionHandler: 或者presentFromRect:inView:animated:completionHandler:; 在手机上:presentAnimated:completionHandler:
说了这么多,理论知识就介绍的差不多了,下面通过代码演示具体实现。 7,Printing Printer-Ready Content (打印准备好的内容)
?
AirPrint可以直接打印一些内容。这些内容是NSData, NSURL, UIImage, and ALAsset类的实例,但是这些实例的内容,或者引用的类型(NSURL)必须是 image 或者pdf.
?
对于 image来说,NSData, NSURL, UIImage, and ALAsset类型都可以的。对于PDF,只能使用NSData, NSURL。然后需要将这些数据实例直接赋值给UIPrintInteractionController实例的printingItem或者printingItems属性。
?
打印pdf:
- (IBAction)printContent:(id)sender {
UIPrintInteractionController *pic =
[UIPrintInteractionControllersharedPrintController]; if (pic && [UIPrintInteractionControllercanPrintData: self.myPDFData] ) { pic.delegate = self;
UIPrintInfo *printInfo = [UIPrintInfoprintInfo]; printInfo.outputType = UIPrintInfoOutputGeneral; printInfo.jobName = [self.pathlastPathComponent]; printInfo.duplex = UIPrintInfoDuplexLongEdge; pic.printInfo = printInfo; pic.showsPageRange = YES;
pic.printingItem = self.myPDFData; void
(^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) { self.content = nil; if (!completed &&
error) NSLog(@\code %u\
error.domain, error.code);
}; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[picpresentFromBarButtonItem:self.printButtonanimated:YES completionHandler:completionHandler]; } else {
共分享92篇相关文档