JavaScript を使用して a のピクセル y オフセットを設定することができます。次にUIWebView
例を示します。
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];
取得する方法はありますか:
- Web ビュー内の PDF の個々のページのピクセル高さ?
- ページ間のギャップのサイズは?
この情報は から入手できますか、UIWebView
それとも別の方法で計算できますか?
ページ数 ( 経由CGPDFDocumentGetNumberOfPages
)、ページ間のピクセル高さのギャップ、または個々のページのピクセル高さがあればoffset
、JavaScript 呼び出しで使用する を計算できると考えています。次に、UIButton
orUISlider
を接続してページ間を移動します。
編集私
解決策はありますがUIWebDocumentView
、のプライベート サブビューである を使用していますUIWebView
。
というビュー コントローラーを作成しますPDFViewerViewController
。これは のサブクラスでありWebViewerViewController
、それ自体が 、 、およびプロトコルに準拠するビューUIToolbar
コントローラーですUIWebView
。UIWebViewDelegate
Myは、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 ビューア (ソース コード付き) を作成した人はいますか?