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];
Другие вопросы по тегам