可以使用JavaScript来设置a的像素y偏移量UIWebView
,例如:
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];
有没有办法得到:
Web视图中PDF的单个页面的像素高度?
页面之间的差距大小?
这些信息UIWebView
是否可以通过其他方式获得?
我想如果我有页数(通过CGPDFDocumentGetNumberOfPages
),页面之间的像素高度差距,或单个页面的像素高度,我可以计算offset
使用JavaScript调用.然后我只是连接一个UIButton
或UISlider
在页面之间移动.
编辑我
我有一个解决方案,但它使用UIWebDocumentView
了一个私人子视图UIWebView
.
我创建了一个名为的视图控制器PDFViewerViewController
,它是一个子类WebViewerViewController
,它本身就是一个视图控制器,它包含a UIToolbar
,a UIWebView
,并且符合UIWebViewDelegate
协议.
在调用PDFViewerViewController
Web视图委托方法之后,我会计算有关封闭Web视图和PDF数据的一些信息-webViewDidFinishLoad:
.
此信息用于计算通过JavaScript提供给Web视图的大致每页偏移量.
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
通过触摸拖动滚动浏览Web视图时,该属性不会更新.可能会拖动几页,然后触摸工具栏上的向左或向右箭头将导致偏移意外移动到上一页.
此解决方案使用UIWebDocumentView
,这是私有的,可能会导致应用拒绝.
我想我会向Apple提交功能增强请求.
有没有人建立一个非UIWebView
基础的PDF查看器(带源代码)?