PDFKit открыть последнюю прочитанную страницу в файле PDF
Поэтому я использую PDFKit для отображения PDF и сохраняю / открываю последнюю прочитанную страницу. Вот мой код Проблема в том, что последняя открытая страница всегда на 2-4 страницы впереди той, которая фактически сохраняется в пользовательских настройках по умолчанию. Я не уверен, что здесь не так.
Игнорируйте код с версиями WebView для iOS ниже 11.
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)
} else {
let path = BookManager.getBookPath(bookLanguageCode: book.bookLanguageCode)
let url = URL(fileURLWithPath: path)
let webView: WKWebView = WKWebView()
webView.loadFileURL(url, allowingReadAccessTo: url)
webView.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
self.containerView.addSubview(webView)
setConstraints(view: webView)
addTapGesture(view: webView)
}
}
private func getLastReadPage() -> Int {
let readPagesDictionary: [String:Int] = DataManager.UserDefaultsManager.value(for: .lastReadPage)
let bookLanguage = book.bookLanguageCode
let lastReadPage = readPagesDictionary[bookLanguage]
return lastReadPage!
}
@available(iOS 11.0, *)
@objc private func saveLastReadPage(notification: Notification) {
let pdfView = notification.object as! PDFView
var page = pdfView.currentDestination?.page?.pageRef?.pageNumber
let bookLanguage = book.bookLanguageCode
var readPageDict: [String:Int] = DataManager.UserDefaultsManager.value(for: .lastReadPage)
readPageDict.updateValue(page!, forKey: bookLanguage)
DataManager.UserDefaultsManager.set(readPageDict, for: .lastReadPage)
}
0 ответов
Что касается меня, я вижу проблему "Индекс от 0" против "Индекс от 1". Я считаю, что в PDFKit недавно были внесены некоторые изменения.
Возможно, раньше это не сработало бы...
С помощью
Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53)
Target: x86_64-apple-darwin19.5.0
а также Xcode Version 11.5 (11E608c)
Это работает для меня:
var currentPageNumber: Int {
let result = pdfView.currentPage?.pageRef?.pageNumber ?? 0
return result > 0 ? result - 1 : 0
}
Один из возможных способов сохранить номер страницы просматриваемой в данный момент страницы:
/// integer(forKey:) returns 0 when not found, which is perfect place to scroll to
/// this only addresses the case you are viewing the same document that was saved to user defaults
/// if you've gone to a new file, start at 0 there
/// you could update the document proxy to contain a last page saved if you have one,
/// and when opening the pdf, save that to user defaults
func saveCurrentPageNumber() {
UserDefaults.standard.set(currentPageNumber, forKey: pageNumberKey)
}
Я звоню из viewWillAppear()
/// Check user defaults and scroll to last page viewed (or 0 if none)
func scrollToSavedPage() {
let pageNumber = UserDefaults.standard.integer(forKey: pageNumberKey)
if let goToPage = document?.page(at: pageNumber) {
pdfView.go(to: goToPage)
}
}
Опять же: YMMV, но это работает для меня.