Существует ли способ программно прокрутить к странице PDF в UIWebView?

Возможно использовать JavaScript для установки пиксельного y-смещения a UIWebView, например:

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];

Так есть ли способ добраться:

  1. Пиксельная высота отдельной страницы PDF в рамках веб-представления?
  2. Размер разрыва между страницами?

Эта информация, доступная от UIWebView или это может быть вычислено через альтернативные средства?

Я думаю это, если у меня есть число страниц (через CGPDFDocumentGetNumberOfPages), пиксельный разрыв высоты между страницами или пиксельная высота отдельной страницы, я могу вычислить offset использовать с вызовом JavaScript. Тогда я просто обеспечиваю электричеством a UIButton или UISlider перемещаться между страницами.


РЕДАКТИРОВАНИЕ I

У меня есть решение, но оно использует UIWebDocumentView, частное подпредставление UIWebView.

Я создаю названный контроллер представления PDFViewerViewController, который является подклассом WebViewerViewController, который самостоятельно является контроллером представления, который содержит a UIToolbar, a UIWebView, и соответствует UIWebViewDelegate протокол.

Мой PDFViewerViewController вычисляет некоторую информацию о веб-представлении включения и данных PDF, после веб-метода делегата представления -webViewDidFinishLoad: назван.

Эта информация используется для вычисления приблизительного смещения на страницу, которое питается к веб-представлению через JavaScript.

PDFViewerViewController.h

#import 
#import "WebViewerViewController.h"

@interface UIWebDocumentView : NSObject {}
@end

@interface PDFViewerViewController : WebViewerViewController {
    NSUInteger offset;
    NSUInteger currentPage;
    NSUInteger documentPages;
    CGFloat documentHeight;
    CGFloat pageHeight;
}

@property (assign) NSUInteger offset;
@property (assign) NSUInteger currentPage;
@property (assign) NSUInteger documentPages;
@property (assign) CGFloat documentHeight;
@property (assign) CGFloat pageHeight;

@end

PDFViewerViewController.m

#import "PDFViewerViewController.h"

@implementation PDFViewerViewController

@synthesize offset;
@synthesize currentPage;
@synthesize documentPages;
@synthesize documentHeight;
@synthesize pageHeight;

- (void) viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *_leftArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowLeft.png"] style:UIBarButtonItemStylePlain target:self action:@selector(leftArrow:)];
    UIBarButtonItem *_flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    UIBarButtonItem *_rightArrow = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ArrowRight.png"] style:UIBarButtonItemStylePlain target:self action:@selector(rightArrow:)];
    [[super.viewerToolbarView toolbar] setItems:[NSArray arrayWithObjects:_leftArrow, _flexibleSpace, _rightArrow, nil]];
    [_leftArrow release];
    [_flexibleSpace release];
    [_rightArrow release];

    self.currentPage = 0;
}

- (void) webViewDidFinishLoad:(UIWebView *)_webView {
    for (UIView *_subview in [[[_webView subviews] objectAtIndex:0] subviews]) {
        if ([_subview isKindOfClass:[UIWebDocumentView class]]) {
            self.documentHeight = _subview.bounds.size.height;
        }
    }

    CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)baseURL);
    self.documentPages = CGPDFDocumentGetNumberOfPages(pdfDocument);
    CGPDFDocumentRelease(pdfDocument);

    self.pageHeight = (self.documentHeight + (10 * self.documentPages)) / self.documentPages;
    self.currentPage = 1;
    self.offset = 0;
}

- (void) leftArrow:(id)_param {
    if (self.currentPage == 1) 
        return;
    self.offset -= (NSUInteger)self.pageHeight;
    self.currentPage--;
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]];
}

- (void) rightArrow:(id)_param {
    if (self.currentPage == self.documentPages) 
        return;
    self.offset += (NSUInteger)self.pageHeight;
    self.currentPage++;
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", (self.offset * 2)]];
}

Некоторые наблюдения

  1. Вычисление смещения не идеально для страницы. Если документ в формате PDF не составляет 8.5 x 11 (например, A4) тогда, ошибка смещения ухудшается более быстро.

  2. self.currentPage свойство не становится обновленным при просмотре веб-представления посредством перетаскивания касание. Можно было бы перетащить несколько страниц, и затем касание левой или правой стрелки на панели инструментов заставит смещение неожиданно перемещаться в предыдущую страницу.

  3. Это решение использование UIWebDocumentView, который является частным и может, вероятно, вызвать отклонение приложения.

Я думаю, что зарегистрирую запрос дополнительной функции с Apple.

Имеет любого, создал не -UIWebView- основанное средство просмотра PDF (с исходным кодом)?

9
задан Alex Reynolds 18 December 2009 в 21:33
поделиться

2 ответа

Я думаю, вам придется загружать и отображать PDF самостоятельно, используя API PDF, а не UIWebView. Вот возможное представление о том, как имитировать прокрутку с привязкой к прямоугольным границам сетки, что может помочь вам сделать работу пользователей более похожей на UIWebView.

iPhone sdk Cocoa Touch - Pass выполняет переход от родительского UIView к дочернему UIScrollview

1
ответ дан 4 December 2019 в 22:28
поделиться

Я видел ваше изменение, о котором идет речь. Создал ли кто-нибудь программу просмотра PDF-файлов, не основанную на UIWebView (с исходным кодом)?

См. Мой вопрос.

Чтение PDF-файлов в виде строки через приложение iPhone

В нем есть функция для отображения каждой PDF-страницы в виде изображения. пользователь может легко менять страницы. Но недостающие моменты заключаются в следующем.

  • пользователь не может сделать никакого выбора - так как это не текст, а изображение.
  • пользователь не может найти никакого текста.
  • пользователь не может масштабировать (о да, вы можете поместить изображение в режим прокрутки для увеличения функциональности)
1
ответ дан 4 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: