如何在iOS中预览类似于WhatsApp上传文档功能的多个PDF文件?

问题描述

我正在集成UIDocumentPickerViewController显示用于浏览和选择PDF的本地存储(文件应用)。现在,我正在选择一个PDF并将URL传递给WKWebview进行预览,效果很好。但是当我启用allowsMultipleSelection时,我可以选择多个文件获取多个URL

NSArray *types = @[(Nsstring*)kUTTypePDF];
//Create a object of document picker view and set the mode to Import
UIDocumentPickerViewController *docPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:types inMode:UIDocumentPickerModeImport];
//Set the delegate
docPicker.delegate = self;
docPicker.allowsMultipleSelection = true; // Allows multiple selection.
//present the document picker
[self presentViewController:docPicker animated:YES completion:nil];

获取多个URL的代表是:

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray <NSURL *>*)urls API_AVAILABLE(ios(11.0));

现在我的输出为:

Multiple selection

使用WKWebView预览时,我只能预览一个文件,如下所示:

Preview

但是我想像WhatsApp一样预览两个选定的文件,如下所示。在这里,我可以水平滑动以预览选定的文件

Multiple files preview

如何预览类似于WhatsApp的多个文件?请在这方面帮助我。

解决方法

使用QLPreviewController;您需要import QuickLook。这是一个视图控制器。您可以将其显示为呈现的视图控制器,或将其推入导航控制器的堆栈中。

在此示例中,我的“文档”目录中某处有一个或多个PDF或文本文档。我获取了它们的URL列表,并显示了它们的预览(self.exts已初始化为由["pdf","txt"]组成的集合):

self.docs = [URL]()
do {
    let fm = FileManager.default
    let docsurl = try fm.url(for:.documentDirectory,in: .userDomainMask,appropriateFor: nil,create: false)
    let dir = fm.enumerator(at: docsurl,includingPropertiesForKeys: nil)!
    for case let f as URL in dir {
        if self.exts.contains(f.pathExtension) {
            if QLPreviewController.canPreview(f as QLPreviewItem) {
                self.docs.append(f)
            }
        }
    }
    guard self.docs.count > 0 else { return }
    let preview = QLPreviewController()
    preview.dataSource = self
    preview.currentPreviewItemIndex = 0
    self.present(preview,animated: true)
} catch {
    print(error)
}

您会注意到,我没有告诉QLPreviewController要预览哪些文档。这就是QLPreviewController的数据源的工作。在我的代码中,我(self)也是数据源。我只是从URL列表中获取所需的信息,而该URL先前已保存到self.docs中:

func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
    return self.docs.count
}
func previewController(_ controller: QLPreviewController,previewItemAt index: Int) -> QLPreviewItem {
        return self.docs[index] as QLPreviewItem
}

第二种数据源方法要求我们返回一个采用QLPreviewItem协议的对象。 URL 确实采用了此协议。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...