Ответ 1
У меня есть идея, как вы могли бы добиться этого в PDFKit. После прочтения документации есть функция, которая позволяет выбирать определенные страницы. Что, вероятно, решит вашу проблему, если вы добавите ее в collectionFlowView.
func selection(from startPage: PDFPage, atCharacterIndex startCharacter: Int, to endPage: PDFPage, atCharacterIndex endCharacter: Int) -> PDFSelection?
Однако, как я прочитал, что у вас есть в основном изображения, есть еще одна функция, которая позволяет извлекать части PDF файла на основе CGPoints:
func selection(from startPage: PDFPage, at startPoint: CGPoint, to endPage: PDFPage, at endPoint: CGPoint) -> PDFSelection?
Также посмотрите на это: https://developer.apple.com/documentation/pdfkit/pdfview
так как это может быть то, что вам нужно, если вы хотите только просматривать страницы без редактирования аннотаций и т.д.
Я также подготовил небольшой код для извлечения одной страницы ниже. Надеюсь, поможет.
import PDFKit
import UIKit
class PDFViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
guard let url = Bundle.main.url(forResource: "myPDF", withExtension: "pdf") else {fatalError("INVALID URL")}
let pdf = PDFDocument(url: url)
let page = pdf?.page(at: 10) // returns a PDFPage instance
// now you have one page extracted and you can play around with it.
}
}
РЕДАКТИРОВАТЬ 1: Посмотрите на это извлечение кода. Я понимаю, что весь PDF загружается, однако этот подход может быть более эффективным с точки зрения памяти, так как, возможно, iOS будет лучше справляться с этим в PDFView:
func readBook() {
if let oldBookView = self.view.viewWithTag(3) {
oldBookView.removeFromSuperview()
// This removes the old book view when the user chooses a new book language
}
if #available(iOS 11.0, *) {
let pdfView: PDFView = PDFView()
let path = BookManager.getBookPath(bookLanguageCode: book.bookLanguageCode)
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView.displayMode = .singlePageContinuous
pdfView.autoScales = true
pdfView.document = pdfDocument
pdfView.tag = 3 // I assigned a tag to this view so that later on I can easily find and remove it when the user chooses a new book language
let lastReadPage = getLastReadPage()
if let page = pdfDocument.page(at: lastReadPage) {
pdfView.go(to: page)
// Subscribe to notifications so the last read page can be saved
// Must subscribe after displaying the last read page or else, the first page will be displayed instead
NotificationCenter.default.addObserver(self, selector: #selector(self.saveLastReadPage),name: .PDFViewPageChanged, object: nil)
}
}
self.containerView.addSubview(pdfView)
setConstraints(view: pdfView)
addTapGesture(view: pdfView)
}
РЕДАКТИРОВАТЬ 2: это не тот ответ, который искал ОП. Это также загружает весь PDF в память. Читать комментарии