Я создаю приложение PDFViewer. Я установил свойство autoScale для PDFViewer равным true, чтобы он расширялся до ширины экрана. Работает отлично с большими документами PDF. Но когда документ является одностраничным документом, страница автоматически прокручивается до конца страницы, а не начинается с начала. Я просто не могу понять причину этого. Что мне здесь не хватает?
Просмотр PDFview в нижней части страницы в документе с одной страницей
Ответ 1
Я думаю, что это ошибка в PDFView.
В качестве обходного пути я предлагаю вручную прокручивать верхнюю часть страницы:
self.pdfView.document = pdfDocument;
NSPoint pt = NSMakePoint(0.0, [self.pdfView.documentView bounds].size.height);
[self.pdfView.documentView scrollPoint:pt];
Репортер ошибок
rdar://37942090: PDFview прокручивается в нижней части страницы в документе на одной странице.
Ответ 2
Я предлагаю это решение для прокрутки к началу первой страницы (оно работает на iOS 11.3):
if let document = pdfView.document,
let firstPage = document.page(at: 0)
{
let firstPageBounds = firstPage.bounds(for: pdfView.displayBox)
pdfView.go(to: CGRect(x: 0, y: firstPageBounds.height, width: 1.0, height: 1.0), on: firstPage)
}
Ответ 3
Расширяя ответ Петро, у меня были некоторые проблемы с повернутыми страницами и обрезанными страницами, но, похоже, это работает повсеместно. Я на самом деле проверил его на повернутых страницах вместе с аннотацией в углу, чтобы убедиться, что я выбрал правильный угол:
guard let firstPage = pdfView!.document?.page(at: 0) else {
return;
}
let firstPageBounds = firstPage.bounds(for: pdfView!.displayBox)
switch (firstPage.rotation % 360) {
case 0:
topLeftX = firstPageBounds.minX
topLeftY = firstPageBounds.maxY
case 90:
topLeftX = firstPageBounds.minX
topLeftY = firstPageBounds.minY
case 180:
topLeftX = firstPageBounds.maxX
topLeftY = firstPageBounds.minY
case 270:
topLeftX = firstPageBounds.maxX
topLeftY = firstPageBounds.maxY
default:
print ("Invalid rotation value, not divisible by 90")
}
pdfView!.go(to: CGRect(x: topLeftX, y: topLeftY, width: 1.0, height: 1.0), on: firstPage)
Ответ 4
Это то, что я сделал, это немного хакерский
if let scrollView = pdfView.subviews.first as? UIScrollView {
scrollView.contentOffset.y = 0.0
}
Ответ 5
Похоже, что команда go
должна быть выполнена при следующем запуске через цикл выполнения для надежной работы:
DispatchQueue.main.async
{
guard let firstPage = pdfView.document?.page(at: 0) else { return }
pdfView.go(to: CGRect(x: 0, y: Int.max, width: 0, height: 0), on: firstPage)
}
Протестировано на iOS 12
Ответ 6
Я загружал документ в viewDidLoad, затем переместил его в viewDidAppear, и он работал для меня.
Ответ 7
Для Objective-C используйте:
PDFPage *firstPage = [pdfView.document pageAtIndex:0];
CGRect firstPageBounds = [firstPage boundsForBox:pdfView.displayBox];
[pdfView goToRect:CGRectMake(0, firstPageBounds.size.height, 1, 1) onPage:firstPage];