背景:
????????我們的應用下載了一個文件低匙,并且需要展示這些文件旷痕,但是app本身不能打開的或者需要提供更多操作方式時,需要調(diào)用別的app來打開這個文件顽冶,在iOS 中提供了UIDocumentInteractionController和QLPreviewController來幫我們完成這件事欺抗。
? ??????UIDocumentInteractionController和QLPreviewController僅支持本地文件的預覽,不支持在線預覽强重,所以需要將其下載到本地后才可進行預覽绞呈。
?一团滥、UIDocumentInteractionController:
????1、UIDocumentInteractionController是一個強大的文檔閱讀器报强,主要功能如下:
????????1)預覽文檔灸姊,包括word文檔、excel文檔秉溉、pdf文檔等等
????????2)調(diào)用iPhone里第三方的app打開文檔
????????3)將文檔用系統(tǒng)級分享到各個應用中(包括QQ力惯、微信、郵箱等)
????????4)如果有條件配備支持AirPrint的打印機的話召嘶,就可以直接打印文檔
????2父晶、實現(xiàn)步驟:
????????1)要聲明一個變量!弄跌!不然后面會發(fā)生崩潰
@interface FileManager()<UIDocumentInteractionControllerDelegate>
@property (nonatomic , strong)UIViewController *viewController;
@property (nonatomic , strong)UIDocumentInteractionController *documentVC;
@end
????????2)在觸發(fā)預覽/共享的地方實現(xiàn)如下代碼:
????????????a.本應用內(nèi)預覽文檔
????self.documentVC = [UIDocumentInteractionController interactionControllerWithURL:fileUrl];
? ? //代理設置 -- 應用內(nèi)預覽必須要添加代理UIDocumentInteractionControllerDelegate
? ? self.documentVC.delegate =self;
? ? //當前app打開甲喝,需實現(xiàn)協(xié)議方法才可以完成預覽功能
? ? [_documentVC presentPreviewAnimated:YES];
????需要實現(xiàn)如下代理方法:
說明:UIDocumentInteractionController雖然它叫控制器,但是它不是真正意義上的控制器而是繼承自NSObject的铛只。所以這個地方需要返回給一個控制器用于展現(xiàn)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的實現(xiàn)和UIDocumentInteractionController類似韧骗,但是QLPreviewController是真正的控制器嘉抒。兩者之間雖然實現(xiàn)效果相同,但是還是存在區(qū)別的:
????????1)QLPreviewController可以一起瀏覽多個文件宽闲,而UIDocumentInteractionController一次只能瀏覽一個文件众眨。
????????2)使用QLPreviewController之前握牧,需要導入QuickLook.framework(如下圖)容诬,并遵守其數(shù)據(jù)源和代理方法。
????2沿腰、實現(xiàn)步驟:
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;
}
預覽效果如下: