在App的開發過程中,我們避免不了要開啟軟體中的檔案,例如:Excel檔案,Word檔案,圖片檔案等不同格式的檔案或者想要通過第三方的App來開啟這些檔案,那麼我們就要用到UIDocumentInteractionController和Quick Look來解決這些問題了。
在iOS系統跨App分享內容的幾種常用技術,比如 URL Scheme, AirDrop,UIDocumentInteractionController , UIActivityViewController
UIDocumentInteractionController是從iOS 3.2的SDK開始支援的,它是直接繼承的 NSObject。
我們就介紹UIDocumentInteractionController的簡單使用。
UIDocumentInteractionController
1.展示一個可以操作我們分享的文件類型的第三方App列表
2.在第一條展示列表的基礎上添加額外的操作,比如 複製 , 列印 , 預覽 , 儲存 等。
3.結合 Quick Look 架構直接展示文檔內容
核心代碼如下:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSURL *url = [[NSBundle mainBundle] URLForResource:@"004" withExtension:@"png"]; // NSString *docu = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // NSString *filePath = [docu stringByAppendingPathComponent:@"004.png"]; // NSURL *url = [NSURL fileURLWithPath:filePath]; self.document = [UIDocumentInteractionController interactionControllerWithURL:url]; self.document.delegate = self; // 不展示可選操作 // [self.document presentOpenInMenuFromRect:self.view.bounds inView:self.view animated:YES]; // 展示可選操作 // 可結合代理方法documentInteractionControllerViewControllerForPreview:顯示預覽 [self.document presentOptionsMenuFromRect:self.view.bounds inView:self.view animated:YES]; }- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller { return self;}/** * 檔案分享面板退出時調用 */- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller { NSLog(@"dismiss");}/** * 檔案分享面板彈出的時候調用 */- (void)documentInteractionControllerWillPresentOpenInMenu:(UIDocumentInteractionController *)controller { NSLog(@"WillPresentOpenInMenu"); }/** * 當選擇一個檔案分享App的時候調用 */- (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(nullable NSString *)application { NSLog(@"begin send : %@", application);}
效果如下:
注意點有:
1.要實現UIDocumentInteractionController的代理方法必須遵守UIDocumentInteractionControllerDelegate協議。
2.UIDocumentInteractionController屬性必須使用retain或strong修飾,控制器必須持有該對象。
3.代碼中的兩個路徑都可以使用。
4.彈出面板的方法一個不展示可選操作,一個展示可選操作。
5.直接使用presentPreviewAnimated:方法彈出預覽。
6.結合代理方法documentInteractionControllerViewControllerForPreview:顯示預覽操作。
直接預覽檔案還有一個方式:QuickLook,使用方式如下:
1.向項目匯入QuickLook.framework。
2.在需要的地方包含標頭檔#import <QuickLook/QuickLook.h>
3.聲明預覽控制器
@property (nonatomic, strong) QLPreviewController *preViewController;
4.遵守協議和資料來源QLPreviewControllerDelegate, QLPreviewControllerDataSource
核心代碼:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 建立預覽控制器 self.preView = [[QLPreviewController alloc] init]; // 設定代理和資料來源 self.preView.delegate = self; self.preView.dataSource = self; [self.preView setCurrentPreviewItemIndex:0]; [self presentViewController:self.preView animated:YES completion:nil]; }#pragma mark QLPreviewControllerDataSource- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller { return 1;}- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{ NSString *docu = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [docu stringByAppendingPathComponent:@"004.png"]; NSURL *url = [NSURL fileURLWithPath:filePath]; return url; }