1

ユーザーがズーム倍率をドキュメントに関連付けて、そのドキュメントを UIWebView 内に表示する際の出発点として使用できるようにしたいと考えています。ただし、これはwebViewDidFinishLoad:レンダリングやレイアウトを含まず、メモリ内ロードの終了を示すだけのようです。問題を示すサンプル コードを次に示します。

- (void)viewDidLoad {
    [super viewDidLoad];
    UIWebView *webView = (UIWebView *)self.view;
    webView.delegate = self;
    webView.scalesPageToFit = YES;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSString *urlString = [[NSBundle mainBundle] pathForResource:@"Doc" ofType:@"pdf"];
    NSURL *file = [NSURL fileURLWithPath:urlString];
    [(UIWebView *)self.view loadRequest:[NSURLRequest requestWithURL:file]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (!webView.isLoading) {
        [webView.scrollView setZoomScale:1.5 animated:YES];
    }
}

setZoomScale: への呼び出しは効果なしで実行されます (つまり、ファイルは 1.0 のズーム係数で表示されます)。これは明らかに、スクロール ビューが処理できる状態になる前に発生するためです。上記の最後の方法を次のように変更すると、すべてが期待どおりに機能します。

- (void)delayedZoomMethod {
    [((UIWebView *)self.view).scrollView setZoomScale:1.5 animated:YES];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self performSelector:@selector(delayedZoomMethod) withObject:nil afterDelay:1.0];
}

もちろん、これは悪い考えです。なぜなら、1.0 の遅延は恣意的であり、ほとんどの場合、おそらく長すぎ、未知の一連の条件下では短すぎる可能性が高いからです。

ドキュメントには、「Webビューのスクロール動作をカスタマイズしたい場合、アプリケーションはスクロールビューにアクセスできます。」と述べています。 Webビューまたはそのスクロールビューの通知またはプロパティを知っている人はいますか?その声明が真実になるのはいつですか?

4

3 に答える 3

2

HTMLコードを制御できる場合、これが役立つ場合があります。次の方法で、html イベントに objC メソッドをトリガーさせることができました。

html イベントは、window.location に文字列を書き込む JavaScript をトリガーし、uiwebview は uiwebviewdelegate を使用して、この関数 webView:shouldStartLoadWithRequest:navigationType: で文字列を受け取ります。

ちょっとハッキーです。

しかし、HTMLページを作成し、ページの最後で実行するjs関数を配置できない限り、Webビューのレンダリングが終了したことを知る方法はないと思います。

于 2012-08-20T19:03:52.377 に答える
0

UIWebViewを使用してPDFファイルをプレビューしている場合、それは最善の方法ではない可能性があります。この目的を目的としたQLPreViewController(iOS 4.0から)があります。クイックルックプレビューコントローラーは、次のアイテムのプレビューを表示できます。

  • iWorkドキュメント
  • Microsoft Officeドキュメント(Office '97以降)
  • リッチテキスト形式(RTF)ドキュメント
  • PDFファイル
  • 画像
  • ユニフォームタイプ識別子(UTI)がpublic.textタイプに準拠しているテキストファイル(Uniform Type Identifiersリファレンスを参照)
  • カンマ区切り値(csv)ファイル
于 2012-08-25T20:11:51.500 に答える
-1

上記の最後の方法を次のように変更すると、すべてが期待どおりに機能します。

もちろん、これは悪い考えです。1.0の遅延は任意であり、ほとんどの場合、おそらく長すぎ、未知の条件のセットでは短すぎる可能性があります。

ドキュメントには、「アプリケーションは、Webビューのスクロール動作をカスタマイズしたい場合、スクロールビューにアクセスできます」と書かれています。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (!webView.isLoading) //WEBDIDFINISHLOAD? {
        [webView.scrollView setZoomScale:1.5 animated:YES];
    }
}

ほら、didFinishLoadMethodはNSURLConnectionからの非同期通知によって呼び出されますが、必ずしもメインスレッドにあるとは限りません(UIの更新が機能していないため)

PerformSelector..afterdelayメソッドは問題ありません。遅延は実際には何の意味もありません。メインスレッドにジャンプしてUIの更新を行い、NSURLConnection通知の完了を許可しているだけです。

afterDelay:0.0と言っても、おそらく問題にはなりません。

これはiOSとOSXで一般的な状況であり、UI、GCD、NSOperationQueuesを更新できるスレッドを把握する必要があり、作成されたスレッドのバックグラウンドrunLoopsはすべてこれを複雑にします。

あなたはあなたの解決策を見つけました、しかしあなたはそれが何を意味するかを知る必要があります。mainThreadでperformSelectorを呼び出し、短い遅延を設定して修正します。

于 2012-08-28T10:06:18.080 に答える