0

tumblrアプリを作ろうとしています。投稿の取得リクエストを行うと、本文の html が返されます。現在、私はhtmlを取得してuiwebviewに押し込んでいます。ビューの幅は常に同じなので設定しましたが、高さを計算する方法がわかりません。これを uitable に配置しようとしているので、各セルの高さを把握する必要があります。

基本的に、html をレンダリングした後に uiwebview の高さを取得することは可能ですか?

4

1 に答える 1

2

これを行うには、javascript トリックを使用します。

HTML 文字列を UIWebView にロードする前に、次の JavaScript を HTML 文字列に追加する必要があります。

NSMutableString *javaScript = [[NSMutableString alloc] init];
[javaScript appendString:@"<script type=\"text/javascript\">"];
[javaScript appendString:@"  window.onload = function() {"];
[javaScript appendString:@"    window.location.href = \"ready://\" + document.body.offsetHeight;"];
[javaScript appendString:@"  }"];
[javaScript appendString:@"</script>"];

この JavaScript は、UIWebView がレンダリングを終了し、上下にスクロールせずにコンテンツ全体を表示するために必要な UIWebView の高さを認識したときにトリガーされます。高さは、javascript 変数 document.body.offsetHeight によって指定されます

JavaScript は UIWebView を URL スキーム ready:// にナビゲートします。

document.body.offsetHeight の値は「ホスト」として格納されます

UIWebView が ready:// に移動しないように、UIWebView デリゲートを使用してこのリクエストをインターセプトする必要があります。

- (BOOL)webView:(UIWebView*)webView
shouldStartLoadWithRequest:(NSURLRequest*)request
 navigationType:(UIWebViewNavigationType)navigationType {

    NSURL *url = [request URL];
    if (navigationType == UIWebViewNavigationTypeOther) {
        if ([[url scheme] isEqualToString:@"ready"]) {

            float contentHeight = [[url host] floatValue];
            NSLog(@"web height:%f",contentHeight);

            //You can use the contentHeight to resize the UIWebView frame



            return NO; //Prevent the UIWebView to navigate to this ready:// scheme
        }
    }
    return YES;
}

「準備完了」スキームは任意の名前です。基本的に、UIWebView は JavaScript によって ready://234 に移動するように求められます。

「ready」はカスタム URL スキームです

「234」は、スクロールせずに HTML のコンテンツをレンダリングするために必要な UIWebView の高さの例です。

于 2012-11-09T07:37:58.747 に答える