iOS 兩種預覽使用詳解(配Demo下載)( Quicklook& UIDocumentInteractionController)


#一、 Demo下載地址

1、QuickLook Demo下載地址
http://download.csdn.net/detail/lovechris00/9831357

demo說明:本demo主要展示了以下類型:

  1. pdf
  2. jpg
  3. gif
  4. ppt
  5. doc
  6. mp4
  7. mp3

demo代碼部分少,資源佔用量較大。

2、 iOS 兩種預覽下載地址

介紹使用 UIDocumentInteractionController QLPreviewController 兩種預覽方式,方便學習者清晰看到區別。


二、 使用

1. 首先,引入框架

<Quicklook/Quicklook.h>

導入框架


2. 將QLPreviewController設置爲屬性

其實說白了,Quicklook只是提供了文檔的預覽功能,從controller的名稱就可以看出。

我們只使用QuicklookController的view,所以將QLPreviewController設置爲屬性

/**  QuickLook預覽頁面  */
@property(nonatomic,strong)  QLPreviewController  *previewController;

3. 初始化

在viewDidLoad中初始化就可以

self.previewController  =  [[QSQLPreviewController  alloc]  init];
/**  這裏我們要使用QLPreviewController的代理方法  */
self.previewController.dataSource  =  self;
self.previewController.delegate  =  self;
self.previewController.view.frame  =  self.view.frame;
/** 這裏需要注意的是,我們不使用Controller,而是使用Controller的View,爲的是避免QLController在Navgation等Controller中帶來的坑 */
[self.view  addSubview:self.previewController.view];


4. 設置代理和數據源

需要用到的代理爲
QLPreviewControllerDataSource,QLPreviewControllerDelegate
實現代理方法,指定QLController訪問的本地文件地址就可以。
這裏返回的QLController中包含的文檔數量,如果想設置左右滑動切換其他文檔,可以設置爲大於1

(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController*)previewController {
    return 1;
}

這裏返回Controller所包含的每個文檔的鏈接(本地),上面的方法設置了1,所以這裏我們只返回一個鏈接,這裏我爲當前Controller設置了一個外部可以傳進來的參數,就是要瀏覽的文檔的地址,返回給QLController就可以了,想訪問多個文檔,可以爲當前Controller設置一個數據源Array,裏面放入文檔的鏈接,這個用idx作爲下標取出來,返回就可以,記得上面的方法返回數據源的個數

-(id)previewController:(QLPreviewController*)previewController previewItemAtIndex:(NSInteger)idx {
    NSURL *fileURL = nil;
    fileURL = [NSURL fileURLWithPath:self.path];
    return fileURL;
}

5. 編碼問題

當然在解碼方面,QLController存在一點問題,打開txt格式文件時,一些windows上編輯的文檔中的中文,可能會出現亂碼現象,在上面方法中可以通過如下方式來進行文件編碼的修改

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx {
    if ([self.path hasSuffix:@"txt"] || [self.path hasSuffix:@"TXT"]) {
        // 處理txt格式內容顯示有亂碼的情況
        NSData *fileData = [NSData dataWithContentsOfFile:self.path];
        // 判斷是UNICODE編碼
  NSString *isUNICODE = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
        // 還是ANSI編碼(-2147483623,-2147482591,-2147482062,-2147481296)encoding 任選一個就可以了
        NSString *isANSI = [[NSString alloc] initWithData:fileData encoding:-2147483623];
        if (isUNICODE) {
        } else {
            NSData *data = [isANSI dataUsingEncoding:NSUTF8StringEncoding];
            [data writeToFile:self.path atomically:YES];
        }
        return [NSURL fileURLWithPath:self.path];
    } else {
        NSURL *fileURL = nil;
        fileURL = [NSURL fileURLWithPath:self.path];
        return fileURL;
    }
}

個人小結

QLPreviewController使用細節

  • 多頁的pdf文件,會自動呈現頁碼;多頁的ppt文件,不會自動出現頁碼;

  • 音樂和視頻點擊播放時,會出現音頻時間,過兩秒就會消失;

  • 滑動預覽其他文件時,音頻視頻都會停止;

  • 音樂預覽點擊可以暫停,視頻無法暫停;

  • 所有文本文件、視頻都可以拖拽放大查看。

  • 使用導航push的方式,無法實現預覽功能;只能用modal的方式來展示。
    [self.navigationController pushViewController:VC animated:YES]; --無效

    [self presentViewController:VC animated:YES completion:nil];–有效


UIDocumentInteractionController


presentOptionsMenuFromRect 和 presentOpenInMenuFromRect 的區別

//顯示不包含預覽菜單項
[_documentController presentOpenInMenuFromRect:btn.frame inView:self.view animated:YES];

presentOpenInMenuFromRect

//顯示包含預覽的菜單項
[_documentController presentOptionsMenuFromRect:btn.frame inView:self.view animated:YES];
下面的按鈕,建議多點擊測試,防止崩潰。

 presentOptionsMenuFromRect



QLPreviewController 和UIDocumentInteractionController 的區別

  1. QLPreviewController是真正的控制器。QLPreviewController繼承自NSObject。
  2. QLPreviewController可以一起瀏覽多個文件,而UIDocumentInteractionController一次只能瀏覽一個文件。
  3. UIDocumentInteractionController使用捏合手勢可以最小化。

參考資料

1.Quicklook,iOS項目集成文檔查看功能

2.使用UIDocumentInteractionController和QLPreviewController預覽文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章