PDFview прокручивает вниз страницы в одностраничном документе
Я создаю приложение PDFViewer. Я установил для свойства autoScale свойства PDFViewer значение true, чтобы его вид расширялся до ширины экрана. Прекрасно работает с большими документами PDF. Но когда документ представляет собой одностраничный документ, страница автоматически прокручивается вниз до конца страницы, а не с начала. Я просто не могу понять причину этого. Что мне здесь не хватает?
9 ответов
Я думаю, что это ошибка в PDFView.
В качестве обходного пути я предлагаю вручную прокрутить верх сверху:
self.pdfView.document = pdfDocument;
NSPoint pt = NSMakePoint(0.0, [self.pdfView.documentView bounds].size.height);
[self.pdfView.documentView scrollPoint:pt];
Bug Reporter
http://rdar//37942090: PDF-просмотр прокручивается вниз страницы в одностраничном документе.
Это то, что я сделал, это немного взломано
if let scrollView = pdfView.subviews.first as? UIScrollView {
scrollView.contentOffset.y = 0.0
}
Я предлагаю это решение для прокрутки к началу первой страницы (оно работает на 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)
}
Выглядит как 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
Я загружал документ в viewDidLoad, затем переместил его в viewDidAppear, и у меня это сработало.
В продолжение ответа Петро, у меня были некоторые проблемы с повернутыми страницами и обрезанными страницами, но, похоже, это работает повсеместно. Я на самом деле проверил его на повернутых страницах вместе с аннотацией в углу, чтобы убедиться, что я выбрал правильный угол:
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)
if let document = PDFDocument(url: viewModel.url) {
pdfView.document = document
// avoid iOS autoscale issue
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
self?.pdfView.autoScales = true
}
}
Я использовал эту работу, чтобы определить
autoScales
свойство немного после загрузки документа. Тогда первая страница красиво помещается сверху.
Вращение PDFPage имеет значение! Это версия Oded для Objective-C:
- (void)scrollToTopOfPage:(PDFPage *)page {
CGRect pageBounds = [page boundsForBox:self.displayBox];
CGFloat topLeftX = 0;
CGFloat topLeftY = 0;
switch (page.rotation % 360) {
case 0:
topLeftX = CGRectGetMinX(pageBounds);
topLeftY = CGRectGetMaxY(pageBounds);
break;
case 90:
topLeftX = CGRectGetMinX(pageBounds);
topLeftY = CGRectGetMinY(pageBounds);
break;
case 180:
topLeftX = CGRectGetMaxX(pageBounds);
topLeftY = CGRectGetMinY(pageBounds);
break;
case 270:
topLeftX = CGRectGetMaxX(pageBounds);
topLeftY = CGRectGetMaxY(pageBounds);
break;
default:
break;
}
[self goToRect:CGRectMake(topLeftX, topLeftY, 1, 1) onPage:page];
}
Для использования 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];