天天看點

ios-檔案預覽-QLPreViewController

         最近在做的項目中有相關pdf檔案預覽的功能,是以了解了一下相關的資料。基本上網上給出來的方法有兩種,分别是用UIWebVie和CGContextDrawPDFPage,可以點選檢視,但是本文所要講的是另外一種方式-----使用QLPreViewController進行預覽,QLPreViewController不僅支援PDF,還支援其他多種檔案的預覽,可謂功能強大。

         先看下官方文檔的說法:

A displayed preview includes a title taken from the last path component of the item URL. You can override this by implementing a 

preview​Item​Title

 accessor for the preview item.

A Quick Look preview controller can display previews for the following items:

  • iWork documents
  • Microsoft Office documents (Office ‘97 and newer)
  • Rich Text Format (RTF) documents
  • PDF files
  • Images
  • Text files whose uniform type identifier (UTI) conforms to the 

    public.text

     type (see Uniform Type Identifiers Reference)
  • Comma-separated value (csv) files

        使用方式:

1.首先建立一個QLPreviewController對象preview;

2.遵循協定QLPreviewControllerDataSource,設定代理;

3.實作協定方法:傳回文檔數量方法- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller;

                           傳回URL的方法 - (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index;

4.模态或push出QLPreviewController的對象preview。

   關鍵代碼:

#pragma mark -QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
    return 1;
}

- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
    
    NSString *filePath = [[HKClassRoomManager sharedInstance] getFilePath:self.classFile];
    
    NSAssert(filePath, @"preview nil item");
    
    NSFileManager* fileManager = [NSFileManager defaultManager];
    NSError* error = nil;
    if ([fileManager fileExistsAtPath:filePath]) {
        NSDictionary* fileInfo = [fileManager attributesOfItemAtPath:filePath
                                                               error:&error];
        NSInteger fileSize = [[fileInfo objectForKey:NSFileSize] integerValue];
        if (fileSize >= 1024 * 1024 * 10) {
            [NSObject showHudTipStr:@"檔案較大,加載可能需要一段時間,請等待...."];
        }
    }
    
    NSData *fileData = [NSData dataWithContentsOfFile:filePath];
    
    //判斷是UNICODE編碼
    NSString *isUNICODE = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
    
    //還是ANSI編碼
    NSString *isANSI = [[NSString alloc] initWithData:fileData encoding:-2147482062];
    
    if (isUNICODE) {
        
        NSString *retStr = [[NSString alloc]initWithCString:[isUNICODE UTF8String] encoding:NSUTF8StringEncoding];
        NSData *data = [retStr dataUsingEncoding:NSUTF16StringEncoding];
        NSError *error = nil;
        [data writeToFile:filePath options:NSDataWritingAtomic error:&error];
    }
    else if(isANSI){
        
        NSData *data = [isANSI dataUsingEncoding:NSUTF16StringEncoding];
        NSError *error = nil;
        [data writeToFile:filePath options:NSDataWritingAtomic error:&error];
    }
    
    
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    return fileURL;
}