Просмотр PDFview в нижней части страницы в документе с одной страницей

Я создаю приложение PDFViewer. Я установил свойство autoScale для PDFViewer равным true, чтобы он расширялся до ширины экрана. Работает отлично с большими документами PDF. Но когда документ является одностраничным документом, страница автоматически прокручивается до конца страницы, а не начинается с начала. Я просто не могу понять причину этого. Что мне здесь не хватает?

Ответ 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];