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

How to preview multiple PDF files in iOS similar to WhatsApp upload documents functionality?

我正在集成 UIDocumentPickerViewController 以显示用于浏览和 selecting PDF 的本地存储(文件应用程序)。现在我正在 select 编辑单个 PDF 并通过将 URL 传递给工作正常的 WKWebview 来预览它。但是当我启用 allowsMultipleSelection 时,我能够 select 多个文件并获得多个 URLs

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];

获取多个 URLs 的委托是:

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

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

但我想像 WhatsApp 一样预览 selected 文件,如下所示。在这里,我可以水平滑动以预览 selected 文件

如何像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 的列表中获取请求的信息,我之前将其保存到 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
}

第二种数据源方法需要我们return一个采用QLPreviewItem协议的对象。 URL是否采用此协议。