文章目錄
#一、 Demo下載地址
1、QuickLook Demo下載地址
http://download.csdn.net/detail/lovechris00/9831357
demo說明:本demo主要展示了以下類型:
- jpg
- gif
- ppt
- doc
- mp4
- 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];
//顯示包含預覽的菜單項
[_documentController presentOptionsMenuFromRect:btn.frame inView:self.view animated:YES];
下面的按鈕,建議多點擊測試,防止崩潰。
QLPreviewController 和UIDocumentInteractionController 的區別
- QLPreviewController是真正的控制器。QLPreviewController繼承自NSObject。
- QLPreviewController可以一起瀏覽多個文件,而UIDocumentInteractionController一次只能瀏覽一個文件。
- UIDocumentInteractionController使用捏合手勢可以最小化。