9

JavaScript を使用して a のピクセル y オフセットを設定することができます。次にUIWebView例を示します。

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"scrollTo(0, %d)", offset]];

取得する方法はありますか:

  1. Web ビュー内の PDF の個々のページのピクセル高さ?
  2. ページ間のギャップのサイズは?

この情報は から入手できますか、UIWebViewそれとも別の方法で計算できますか?

ページ数 ( 経由CGPDFDocumentGetNumberOfPages)、ページ間のピクセル高さのギャップ、または個々のページのピクセル高さがあればoffset、JavaScript 呼び出しで使用する を計算できると考えています。次に、UIButtonorUISliderを接続してページ間を移動します。


編集私

解決策はありますがUIWebDocumentView、のプライベート サブビューである を使用していますUIWebView

というビュー コントローラーを作成しますPDFViewerViewController。これは のサブクラスでありWebViewerViewController、それ自体が 、 、およびプロトコルに準拠するビューUIToolbarコントローラーですUIWebViewUIWebViewDelegate

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)]];
}

いくつかの観察

  1. オフセットの計算は完全なページではありません。PDF ドキュメントが 8.5 x 11 (A4 など) でない場合、オフセット エラーはさらに悪化します。

  2. タッチドラッグで Web ビューをスクロールすると、self.currentPageプロパティが更新されません。いくつかのページをドラッグしてから、ツールバーの左矢印または右矢印に触れると、オフセットが予期せず前のページに移動することがあります。

  3. このソリューションUIWebDocumentViewでは、非公開の を使用しており、アプリが拒否される可能性があります。

Apple に機能強化のリクエストを提出しようと思います。

UIWebViewベースの PDF ビューア (ソース コード付き) を作成した人はいますか?

4

5 に答える 5

4

したがって、この投稿はかなり前から公開されていますが、「scroll pdf uiwebview」の Google 検索での最初のエントリであるため、将来の読者のためにこれについての見解を提供したいと思います。

純粋な Java Script だけを使用して、PDF ドキュメント内の特定のページにスクロールできます。私たちのブログ ( http://apptech.next-munich.com/2011/02/pdf-in-uiwebview.html ) にサンプル コードを投稿しましたが、必要な作業の簡単な要約を以下に示します。

  1. window.outerHeight DOM プロパティを使用して、レンダリングされた PDF ドキュメントの全体の高さを確認します。
  2. window.innerHeight DOM プロパティを使用して、ブラウザー座標でブラウザー ウィンドウの高さを見つけます。
  3. window.scrollTo(x, y) 関数を使用してページにジャンプします。

ただし、outerHeight をページ数でデバイスして、取得したものにジャンプすることはできないという 1 つの落とし穴があります。代わりに、innerHeight/webView.bounds.size.height の比率を掛ける必要があります。

于 2011-02-11T09:22:41.413 に答える
1

問題の編集を見ました。UIWebViewベースではないPDFビューア(ソースコード付き)を作成した人はいますか?

私の質問を参照してください。

iPhoneアプリケーションを介して文字列としてPDFファイルを読み取る

各PDFページを画像ビューで表示する機能があります。ユーザーは簡単にページを変更できます。ただし、不足している点は以下のとおりです。

  • ユーザーは選択できません-テキストではなく画像であるため
  • ユーザーはテキストを見つけることができません。
  • ユーザーはズームできません(そうです-ズーム機能のために画像ビューをスクロールビューに入れることができます)
于 2010-03-04T09:46:53.723 に答える
1

tableView(サムネイルテーブルビュー)でそのページに対応するセルを選択すると、PDF(UIWebViewを使用して表示される)の特定のページにスクロールする必要があるという同様の問題に直面しました。

そこで、PDF の特定のページにスクロールできるようにするコードを書きました。

私はJavaScriptコードを使用していません。元のPDFページに毎回適用されるズームスケールを追跡し、各ページにスクロールするために必要な更新されたオフセットを計算しています。したがって、これは PDF がズーム状態であっても機能します。

コードはこちらにあります。

于 2013-09-24T05:35:09.990 に答える
1

PDF をロードするために一般的に使用される uiwebview には、呼び出し可能な独自の scrollview オブジェクトがあります。このようなことを試してください:

    [webview.scrollView setContentOffset:CGPointMake(0, webview.scrollView.contentOffset.y + 100) animated:YES];    

これにより、pdf のビューが 100 ピクセル下にスクロールされます。PDFのページ番号を取得することに関しては、javascriptが必要なものであるとしか想像できません。または、pdf の各ページのピクセル数がわかっている場合は、必要に応じて増減します。:)

于 2012-09-14T00:56:58.297 に答える
1

UIWebView ではなく、PDF API を使用して自分で PDF を読み込んで表示する必要があると思います。長方形のグリッド境界へのスナップ スクロールをシミュレートする方法の考えられるアイデアを次に示します。これにより、ユーザーのエクスペリエンスを UIWebView のようにすることができます。

iPhone sdk Cocoa Touch - 親UIViewから子UIScrollviewにタッチダウンを渡します

于 2009-12-18T13:14:53.150 に答える