背景:
我们的应用下载了一个文件,并且需要展示这些文件,但是app本身不能打开的或者需要提供更多操作方式时,需要调用别的app来打开这个文件,在iOS 中提供了UIDocumentInteractionController和QLPreviewController来帮我们完成这件事。
UIDocumentInteractionController和QLPreviewController仅支持本地文件的预览,不支持在线预览,所以需要将其下载到本地后才可进行预览。
一、UIDocumentInteractionController:
1、UIDocumentInteractionController是一个强大的文档阅读器,主要功能如下:
1)预览文档,包括word文档、excel文档、pdf文档等等
2)调用iPhone里第三方的app打开文档
3)将文档用系统级分享到各个应用中(包括QQ、微信、邮箱等)
4)如果有条件配备支持AirPrint的打印机的话,就可以直接打印文档
2、实现步骤:
1)要声明一个变量!!不然后面会发生崩溃
@interface FileManager()<UIDocumentInteractionControllerDelegate>
@property (nonatomic , strong)UIViewController *viewController;
@property (nonatomic , strong)UIDocumentInteractionController *documentVC;
@end
2)在触发预览/共享的地方实现如下代码:
a.本应用内预览文档
self.documentVC = [UIDocumentInteractionController interactionControllerWithURL:fileUrl];
//代理设置 -- 应用内预览必须要添加代理UIDocumentInteractionControllerDelegate
self.documentVC.delegate =self;
//当前app打开,需实现协议方法才可以完成预览功能
[_documentVC presentPreviewAnimated:YES];
需要实现如下代理方法:
说明:UIDocumentInteractionController虽然它叫控制器,但是它不是真正意义上的控制器而是继承自NSObject的。所以这个地方需要返回给一个控制器用于展现documentController在其上面,所以我们就返回当前控制器self
#pragma mark- UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
return self;}
b.在其他应用中打开、分享
BOOL canOpen = [self.documentVC presentOpenInMenuFromRect:CGRectZero inView:_viewController.view animated:YES];
if(canOpen ==NO){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"message:@"没 有找到可以打开该文件的应用"delegate:nil cancelButtonTitle:@"确定"otherButtonTitles:nil, nil];
[alert show];
}
无法打开时,弹窗告知,不然用户会感觉莫名其妙。在其他应用中打开、分享时,依然需事先其代理方法,再此就不列举了。
二、QLPreviewController
1、QLPreviewController的实现和UIDocumentInteractionController类似,但是QLPreviewController是真正的控制器。两者之间虽然实现效果相同,但是还是存在区别的:
1)QLPreviewController可以一起浏览多个文件,而UIDocumentInteractionController一次只能浏览一个文件。
2)使用QLPreviewController之前,需要导入QuickLook.framework(如下图),并遵守其数据源和代理方法。
2、实现步骤:
NSString *urlStr = [[NSBundle mainBundle] pathForResource:@"111.pdf" ofType: nil];
NSURL *url= [NSURL fileURLWithPath:urlStr];
if ([QLPreviewController canPreviewItem: (id<QLPreviewItem>)url]{
QLPreviewController *qlVc = [[QLPreviewController alloc] init];
qlVc.view.frame = CGRectMake(0,64,self.view.frame.size.width,self.view.frame.size.height-64);
qlVc.delegate = self;
qIVc.dataSource = self;
qlVc.navigationController.navigationBar.userInteractionEnabled = YES;
qlVc.view.userInteractionEnabled = YES;
[self presentviewController:qlVc animated:YES completion:nil];
#pragma mark—QLPreviewController代理方法
- (NSInteger)numberOfPreviewItemsInPreviewController: (QLPreviewController *)controller{
return 1;
}
-(id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{
return self.fileurl;
}
预览效果如下: