Ale*_*lds 9 pdf iphone uiwebview cgpdfdocument
可以使用JavaScript来设置a的像素y偏移量UIWebView
,例如:
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];
Run Code Online (Sandbox Code Playgroud)
有没有办法得到:
这些信息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 <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
Run Code Online (Sandbox Code Playgroud)
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)]];
}
Run Code Online (Sandbox Code Playgroud)
一些观察
偏移计算不是页面完美的.如果PDF文档不是8.5 x 11(例如A4),则偏移误差会更快地恶化.
self.currentPage
通过触摸拖动滚动浏览Web视图时,该属性不会更新.可能会拖动几页,然后触摸工具栏上的向左或向右箭头将导致偏移意外移动到上一页.
此解决方案使用UIWebDocumentView
,这是私有的,可能会导致应用拒绝.
我想我会向Apple提交功能增强请求.
有没有人建立一个非UIWebView
基础的PDF查看器(带源代码)?
我认为您必须使用 PDF API 而不是 UIWebView 自己加载和显示 PDF。这里有一个关于如何模拟捕捉滚动到矩形网格边界的可能想法,这可以帮助您使用户的体验更像 UIWebView。
iPhone sdk Cocoa Touch - 将触摸从父 UIView 传递到子 UIScrollview