使用IOS AirPrint实现打印功能详解

 更新时间:2021年04月13日 10:06:40   作者:旺仔饼饼  
这篇文章主要介绍了使用IOS AirPrint实现打印功能详解,想了解无线打印的同学,一定要看一下

内容

1.什么是AirPrint

其实就是将iOS(iphone,ipad)上的内容,使用支持AirPrint的打印机打印出来。打印过程无线控制, 非常方便。

2.第一手资料

学习iOS, 第一手资料肯定非苹果官方文档莫属.
here。 (我下面叙述的内容基本上是对文档的总结, 英语可以的建议直接看文档。。。)

3.Printer Simulator,使用打印模拟器进行测试

既然涉及打印功能,那么就需要有一台支持AirPrint 功能的打印机进行测试喽,你没有?没关系!苹果已经为我们准备好了模拟器。 这个模拟器在Xcode中没有, 需要自己到官网下载

打印模拟器位置

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: 自定义页渲染者。

5.关于AirPrint的API

AirPrint的api包含 eight classes and one protocol。 下图是它们之间的关系。(下面这张图明白了, 那你基本就掌握了)。

AirPrint相关类

UIPrintInteractionController 属性:

  1. UIPrintInfo *printInfo: 打印任务的信息。
  2. UIPrintPaper * printPaper : 打印内容的区域。
  3. delegate: 遵守UIPrintInteractionControllerDelegate 协议的代理。
  4. 最重要的就是制定需要打印的内容: printingItem , printingItems, printFormatter, printPageRenderer。 四个属性都是用来指定要打印的内容的。 这四个参数是互斥的, 也就是说只要一个赋值, 其他三个参数就得是nil. 很容易理解,一个打印任务, 不能同时干多个活呀。 这里如果使用 swift的枚举,就很容易理解了。

需要打印的内容与相应参数的对应方式

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 = [UIPrintInteractionController sharedPrintController];

    if (pic && [UIPrintInteractionController canPrintData: self.myPDFData] ) {

    pic.delegate = self;

     
    UIPrintInfo *printInfo = [UIPrintInfo printInfo];

    printInfo.outputType = UIPrintInfoOutputGeneral;

    printInfo.jobName = [self.path lastPathComponent];

    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(@"FAILED! due to error in domain %@ with error code %u",

    error.domain, error.code);

    };

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    [pic presentFromBarButtonItem:self.printButton animated:YES

    completionHandler:completionHandler];

    } else {

    [pic presentAnimated:YES completionHandler:completionHandler];

    }

}

通过在iPhone上测试, 显示出的全部是英文的,不要担心, 因为这是系统的控件,也就是说系统会自动帮你作国际化处理,你不用作任何事情!
你唯一要作的事–––将Info.plist文件中的第一项 Localization native development region(CFBundleDevelopmentRegion)的值设为 China(zh_CN);

Printer Options显示英文

将英文修改成中文

8.Using Print Formatters (打印格式化者)

系统提供了三个 Print Formatters类, 分别是:

  1. UIViewPrintFormatter—automatically lays out the content of a view over multiple pages. To obtain a print formatter for a view, call the view's viewPrintFormatter method. Not all built-in UIKit classes support printing. Currently, only the view classes UIWebView, UITextView, and MKMapView know how to draw their contents for printing. View formatters should not be used for printing your own custom views. To print the contents of a custom view, use a UIPrintPageRenderer instead.
  2. UISimpleTextPrintFormatter—automatically draws and lays out plain-text documents. This formatter allows you to set global properties for the text, such a font, color, alignment, and line-break mode.
  3. UIMarkupTextPrintFormatter—automatically draws and lays out HTML documents.

英文介绍已经很详细了, 就不啰嗦了, 直接展示出打印HTML文档的代码:

- (IBAction)printContent:(id)sender {

    UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];

    pic.delegate = self;

     
    UIPrintInfo *printInfo = [UIPrintInfo printInfo];

    printInfo.outputType = UIPrintInfoOutputGeneral;

    printInfo.jobName = self.documentName;

    pic.printInfo = printInfo;

     
    UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc]

    initWithMarkupText:self.htmlString];

    htmlFormatter.startPage = 0;

    htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch margins

    pic.printFormatter = htmlFormatter;

    pic.showsPageRange = YES;

     
    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =

    ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {

    if (!completed && error) {

    NSLog(@"Printing could not complete because of error: %@", error);

    }

    };

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    [pic presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];

    } else {

    [pic presentAnimated:YES completionHandler:completionHandler];

    }

}

将UIWebView 界面上显示的内容打印出来。

- (void)printWebPage:(id)sender {

    UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];

    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =

    ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {

    if(!completed && error){

    NSLog(@"FAILED! due to error in domain %@ with error code %u",

    error.domain, error.code);

    }

    };

    UIPrintInfo *printInfo = [UIPrintInfo printInfo];

    printInfo.outputType = UIPrintInfoOutputGeneral;

    printInfo.jobName = [urlField text];

    printInfo.duplex = UIPrintInfoDuplexLongEdge;

    controller.printInfo = printInfo;

    controller.showsPageRange = YES;

     
    UIViewPrintFormatter *viewFormatter = [self.myWebView viewPrintFormatter];

    viewFormatter.startPage = 0;

    controller.printFormatter = viewFormatter;

     
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    [controller presentFromBarButtonItem:printButton animated:YES completionHandler:completionHandler];

    }else

    [controller presentAnimated:YES completionHandler:completionHandler];

}

9.Using a Page Renderer(页渲染器)

这部分内容是最复杂的了, 感觉不怎么用,暂且不深究了, 大家如果项目需要, 自己看文档吧。

以上就是使用IOS AirPrint实现打印功能详解的详细内容,更多关于IOS AirPrint打印功能的资料请关注脚本之家其它相关文章!

相关文章

  • 详解iOS游戏开发中Cocos2D的坐标位置关系

    详解iOS游戏开发中Cocos2D的坐标位置关系

    这篇文章主要介绍了iOS游戏开发中Cocos2D的坐标位置关系,Cocos2D是专门用来开发iOS游戏的开源框架,文中示例代码采用Objective-C语言,需要的朋友可以参考下
    2016-02-02
  • 详解Objective-C编程中对设计模式中适的配器模式的使用

    详解Objective-C编程中对设计模式中适的配器模式的使用

    这篇文章主要介绍了Objective-C编程中对设计模式中适的配器模式的使用,适配器模式中的Adapter适配器允许接口不兼容的类在一起工作,需要的朋友可以参考下
    2016-03-03
  • 一个方法搞定iOS下拉放大及上推缩小

    一个方法搞定iOS下拉放大及上推缩小

    在很多的APP中,我们可以看到一个列表顶部的图片会随着下拉会放大,随着上推缩小。这样的效果没能给定一个固有名词,现在本文介绍使用代码实现这样的效果,代码量很少,容易理解。当然实现效果是很好的。
    2016-07-07
  • 总结iOS实现渐变颜色的三种方法

    总结iOS实现渐变颜色的三种方法

    这篇文章主要给大家总结了iOS实现渐变颜色的三种方法,分别是利用CAGradientLayer实现渐变、Core Graphics相关方法实现渐变以及用CAShapeLayer作为layer的mask属性实现,大家可以根据自己的需要选择使用,下面来一起看看吧。
    2016-10-10
  • iOS App开发中UISearchBar搜索栏组件的基本用法整理

    iOS App开发中UISearchBar搜索栏组件的基本用法整理

    iOS开发组件中自带的UISearchBar提供了很多基础和好用的搜索栏UI功能,下面就来总结一下iOS App开发中UISearchBar搜索栏组件的基本用法整理,需要的朋友可以参考下
    2016-05-05
  • IOS 开发之ObjectiveC的变量类型的字符代表

    IOS 开发之ObjectiveC的变量类型的字符代表

    这篇文章主要介绍了IOS 开发之ObjectiveC的变量类型的字符代表的相关资料,这里举例说明如何使用Objective的变量类型的字符,帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • iOS动态验证码实现代码

    iOS动态验证码实现代码

    本文通过实例代码给大家介绍了ios动态验证码的实现方法,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-04-04
  • IOS之UIWebView的使用(基本知识)

    IOS之UIWebView的使用(基本知识)

    在Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个 UIWebView 组件来作为混合模式开发的桥梁,那么下面就对UIWebView的一些基本知识详解一下
    2016-02-02
  • iOS App开发中UITextField组件的常用属性小结

    iOS App开发中UITextField组件的常用属性小结

    这篇文章主要介绍了iOS App开发中UITextField组件的常用属性小结,文中还介绍了UITextField隐藏键盘及为内容增加校验的两个使用技巧,需要的朋友可以参考下
    2016-04-04
  • iOS NSDate中关于夏令时的坑

    iOS NSDate中关于夏令时的坑

    这篇文章主要给大家介绍了关于iOS NSDate中夏令时的坑,以及iOS 时间字符串&NSDate&时间戳 相互转换的相关内容,分享出来供大家参考学习,需要的朋友可以参考借鉴,下面随小编来一起学习学习吧
    2018-08-08

最新评论