可以使用 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
、 aUIWebView
并符合UIWebViewDelegate
协议的视图控制器。
在调用 Web 视图委托方法后,我PDFViewerViewController
会计算有关封闭 Web 视图和 PDF 数据的一些信息-webViewDidFinishLoad:
。
此信息用于计算通过 JavaScript 提供给 Web 视图的近似每页偏移量。
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),那么偏移误差会更快地恶化。
通过触摸拖动滚动浏览 Web 视图时,该
self.currentPage
属性不会更新。可能会拖几页,然后触摸工具栏上的左箭头或右箭头会导致偏移量意外移动到上一页。此解决方案使用
UIWebDocumentView
, 这是私有的,可能会导致应用程序拒绝。
我想我会向 Apple 提出功能增强请求。
有没有人构建了一个非UIWebView
基础的 PDF 查看器(带有源代码)?