Есть ли способ программно прокрутить страницу PDF в UIWebView?
Можно использовать JavaScript, чтобы установить пиксельное смещение по оси Y UIWebView
Например:
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];
Так есть ли способ получить:
- Высота пикселя отдельной страницы PDF в веб-представлении?
- Размер разрыва между страницами?
Доступна ли эта информация от UIWebView
или это можно рассчитать альтернативными методами?
Я думаю, что если у меня есть количество страниц (через CGPDFDocumentGetNumberOfPages
), разрыв в пикселях между страницами или высота отдельных страниц, я могу вычислить offset
использовать с вызовом JavaScript. Тогда я просто подключаю UIButton
или же UISlider
перемещаться между страницами.
РЕДАКТИРОВАТЬ Я
У меня есть решение, но оно использует UIWebDocumentView
частное подвид UIWebView
,
Я создаю вид контроллера под названием PDFViewerViewController
, который является подклассом WebViewerViewController
, который сам по себе является контроллером представления, который содержит UIToolbar
, UIWebView
и соответствует UIWebViewDelegate
протокол.
мой PDFViewerViewController
вычисляет некоторую информацию о вмещающем веб-представлении и данных PDF после метода делегирования веб-представления -webViewDidFinishLoad:
вызывается.
Эта информация используется для расчета приблизительного смещения на страницу, которое подается в веб-представление с помощью JavaScript.
PDFViewerViewController.h
#import <UIKit/UIKit.h>
#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)]];
}
Некоторые наблюдения
Расчет смещения не является идеальным для страницы. Если размер документа PDF не равен 8,5 x 11 (например, A4), ошибка смещения усугубляется быстрее.
self.currentPage
свойство не обновляется при прокрутке веб-вида путем перетаскивания. Можно перетащить несколько страниц, а затем прикосновение к стрелке влево или вправо на панели инструментов приведет к неожиданному перемещению смещения на предыдущую страницу.Это решение использует
UIWebDocumentView
, который является частным и может вызвать отклонение приложения.
Я думаю, что я подам запрос на улучшение функции в Apple.
Кто-нибудь построил UIWebView
Просмотрщик PDF (с исходным кодом)?
5 ответов
Так что этот пост был открыт довольно давно, но так как это первая запись в поиске Google для "scroll pdf uiwebview", я подумал, что я предоставлю свой взгляд на это для будущих читателей.
Вы действительно можете прокрутить до определенной страницы в документе PDF, используя только чистый Java Script. Я разместил пример кода в нашем блоге ( http://apptech.next-munich.com/2011/02/pdf-in-uiwebview.html), но вот краткое резюме того, что вам нужно сделать:
- Используйте свойство DOM window.outerHeight, чтобы найти общую высоту отображаемого PDF-документа.
- Используйте свойство DOM window.innerHeight, чтобы найти высоту окна браузера в координатах браузера.
- Перейдите на страницу, используя функцию window.scrollTo(x, y).
Однако есть одна загвоздка в том, что вы не можете просто обработать externalHeight по количеству страниц и перейти к тому, что вы получите. Вместо этого вам придется умножать на отношение innerHeight/webView.bounds.size.height.
Я видел ваше редактирование в вопросе. Кто-нибудь создавал просмотрщик PDF не на основе UIWebView (с исходным кодом)?
Смотри мой вопрос.
Чтение PDF-файлов в виде строки через приложение iPhone
Он имеет функциональность для отображения каждой страницы PDF в виде изображения. Пользователь может легко менять страницы. Но недостающие моменты заключаются в следующем.
- Пользователь не может сделать выбор - это не текст, а изображение
- Пользователь не может найти текст.
- пользователь не может масштабировать (о да - вы можете поместить изображение в режим прокрутки для увеличения)
Uiwebview, обычно используемый для загрузки pdf, имеет собственный объект scrollview, к которому вы можете обращаться. попробуйте что-то вроде этого:
[webview.scrollView setContentOffset:CGPointMake(0, webview.scrollView.contentOffset.y + 100) animated:YES];
Это позволит прокрутить просмотр для PDF вниз на 100 пикселей. Что касается получения pagenumber pdf, я могу только представить, что javascript - это то, на что вам нужно взглянуть. Или, если вы просто знаете количество пикселей на каждой странице pdf, то увеличивайте или уменьшайте по мере необходимости.:)
Я столкнулся с подобной проблемой, в которой мне пришлось прокручивать до определенной страницы в PDF (которая отображается с помощью UIWebView) при выборе ячейки, соответствующей этой странице в tableView (миниатюра tableview).
Поэтому я написал фрагмент кода, который позволяет вам прокручивать до определенной страницы в PDF.
Я не использую какой-либо код JavaScript. Я просто отслеживаю масштаб увеличения, примененный к исходной странице PDF каждый раз, и вычисляю обновленное смещение, необходимое для прокрутки на каждую страницу. Таким образом, это работает, даже если PDF находится в увеличенном состоянии.
Вы можете найти код здесь.
Я думаю, что вам придется загружать и отображать PDF самостоятельно, используя PDF API, а не UIWebView. Вот возможная идея о том, как имитировать щелчковую прокрутку до границ прямоугольной сетки, которая может помочь вам сделать пользовательский интерфейс более похожим на UIWebView.
iPhone SDK Cocoa Touch - передача прикосновения от родительского UIView к дочернему UIScrollview