Возможно использовать JavaScript для установки пиксельного y-смещения a UIWebView
, например:
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];
Так есть ли способ добраться:
Эта информация, доступная от 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)]];
}
Некоторые наблюдения
Вычисление смещения не идеально для страницы. Если документ в формате PDF не составляет 8.5 x 11 (например, A4) тогда, ошибка смещения ухудшается более быстро.
self.currentPage
свойство не становится обновленным при просмотре веб-представления посредством перетаскивания касание. Можно было бы перетащить несколько страниц, и затем касание левой или правой стрелки на панели инструментов заставит смещение неожиданно перемещаться в предыдущую страницу.
Это решение использование UIWebDocumentView
, который является частным и может, вероятно, вызвать отклонение приложения.
Я думаю, что зарегистрирую запрос дополнительной функции с Apple.
Имеет любого, создал не -UIWebView
- основанное средство просмотра PDF (с исходным кодом)?
Я думаю, вам придется загружать и отображать PDF самостоятельно, используя API PDF, а не UIWebView. Вот возможное представление о том, как имитировать прокрутку с привязкой к прямоугольным границам сетки, что может помочь вам сделать работу пользователей более похожей на UIWebView.
iPhone sdk Cocoa Touch - Pass выполняет переход от родительского UIView к дочернему UIScrollview
Я видел ваше изменение, о котором идет речь. Создал ли кто-нибудь программу просмотра PDF-файлов, не основанную на UIWebView (с исходным кодом)?
См. Мой вопрос.
Чтение PDF-файлов в виде строки через приложение iPhone
В нем есть функция для отображения каждой PDF-страницы в виде изображения. пользователь может легко менять страницы. Но недостающие моменты заключаются в следующем.