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