0

これは一般的な問題のようですが、適切な解決策を見つけることができません。多数のUIWebViewのサイズを変更してコンテンツに合わせようとしていますが、正しく機能していないようです。私がこれまでに見つけた最良の解決策はこの答えですが、私の解決策ではたまにしか機能しないようです。webViewDidFinishLoad:アイデアは、 delegateメソッドでUIWebViewのサイズを変更することです。ただし、これでも適切なサイズが得られません。 の未定義の時間に更新をトリガーするwebViewDidFinishLoad:と、コンテンツのサイズが正しく設定されます。

以下に私の状況を説明し、関連するソースをGistに貼り付けます。

問題の説明

JSON APIからデータを取得し、そのデータをWebビューに表示している状況があります。APIはオブジェクトの配列を返し、各オブジェクトにはHTML形式のテキストを含む「コンテンツ」フィールドがあります。設計者は、上にスワイプして表示する(ほとんど)非表示のビューを含む構造を提供しました。これには、非常に特殊な方法でフォーマットされたすべてのコンテンツのスクロールビューが含まれます。

これを実装するために、3つのビューコントローラーがあります。メインビューコントローラー、メインビューコントローラーを上にスワイプして表示するセカンダリビューコントローラー、およびJSONAPIの結果からHTML形式のコンテンツの1つのアイテムを表示するターシャリビューコントローラーです。 。
セカンダリビューコントローラには、UIScrollViewとターシャリビューコントローラの配列が含まれています。各ターシャリビューコントローラには、HTML形式のコンテンツを表示するためのUIWebViewと、JSONオブジェクトの他の属性を表示するためのラベルが含まれています。三次ビューは二次ビューのUIScrollView内に表示されるため、三次ビューのUIWebViewは、混乱するスクロールビューのスクロールビューを防ぐために、コンテンツに合わせてサイズを変更し、ユーザー操作を無効にする必要があります。シナリオ。

これらすべてを機能させるためのプロセスは次のとおりです。

  1. まず、プライマリコントローラーのViewDidLoadで、セカンダリビューとアクティビティインジケーターを読み込んで表示し、UIがフリーズしていないようにします。
  2. 次に、JSONAPIからデータをロードします
  3. APIからのデータがロードされたら(デリゲートを介して通知されます)、ターシャリビューコントローラを構築し、ロードされたデータから属性を設定して、セカンダリコントローラのリストに追加します。
  4. それが終了したら、セカンダリコントローラのセットアップメソッドを呼び出します。このメソッドは、3次コントローラーのリストをループし、それらのセットアップメソッドを順番に呼び出します。
  5. 各ターシャリコントローラーのセットアップメソッドは、ラベルのテキストを設定しloadHTMLString:、JSONオブジェクトのコンテンツをで置き換えた事前定義されたhtmlファイルのコンテンツを使用してUIWebViewのコンテンツを設定します。
  6. ターシャリコントローラーのwebViewDidFinishLoad:デリゲートメソッドで、この回答のメソッドを使用して、コンテンツサイズに基づいてWebビューのサイズを変更します。
  7. Webビューに合わせて、3次コントローラーのビューのサイズを変更し、Webビューの下に表示されるラベルを配置します。
  8. 次に、ターシャリコントローラはデリゲートメソッドを呼び出して、ロードが終了したことをセカンダリコントローラに通知します。セカンダリコントローラは、そのターシャリコントローラのどれがロードを終了したかを監視します。
  9. すべてのターシャリコントローラのロードが完了すると、セカンダリコントローラはそのリストをループし、UIScrollViewのコンテンツにターシャリビューを追加し、フレームとコンテンツの高さを調整します。
4

2 に答える 2

6

iOS 5.0 を使用している場合は、おそらく webview.scrollView.contentsize を使用できます。それ以外の場合は、javascript を介してコンテンツ サイズを取得することもできます。

CGFloat newHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] floatValue];

または代わりに

CGFloat newHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight;"] floatValue];
于 2012-07-30T02:49:48.670 に答える
0

私はあなたが解決策を持っていることを知っています、しかし私はちょうどこの問題を自分で解決しました、そして私は単純でありながら愚かな答えを思いつきました。

最初はUIWebView成長するだけで、縮小することはありませんでした。そこで、フレームサイズを設定することから始めましたが、小さすぎるフレームでスクロールしようとするため、contentSize.height何かをロードするたびに1に設定しました。私の仕上げ荷重は次のようになりました

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"--- webViewDidFinishLoad (pre sizeToFit) webview.frame = %@", NSStringFromCGRect(_detailsWebView.frame));
    NSLog(@"--- webViewDidFinishLoad (pre sizeToFit) scrollview.contentSize = %@", NSStringFromCGSize(_detailsWebView.scrollView.contentSize));
    [_detailsWebView sizeToFit];
    NSLog(@"--- webViewDidFinishLoad (post sizeToFit) scrollview.contentSize = %@", NSStringFromCGSize(_detailsWebView.scrollView.contentSize));
    NSLog(@"--- webViewDidFinishLoad (post sizeToFit) webview.frame = %@", NSStringFromCGRect(_detailsWebView.frame));
}

しかし、これは私に次のような出力を与えました

[8431:707] --- webViewDidFinishLoad (pre sizeToFit) webview.frame = {{20, 11}, {663, 757}}
[8431:707] --- webViewDidFinishLoad (pre sizeToFit) scrollview.contentSize = {663, 1}
[8431:707] --- webViewDidFinishLoad (post sizeToFit) scrollview.contentSize = {663, 92}
[8431:707] --- webViewDidFinishLoad (post sizeToFit) webview.frame = {{20, 11}, {663, 1}}

「新しい」コンテンツが古いコンテンツよりも大きい限り機能するようになりましたが、コンテンツが縮小すると問題が発生しました。それが更新される前に、どういうわけかウェブビューsizeToFitのを更新していたことが判明しましたframecontentSize

frame電話をかけたcontentSize後、手動で更新することでこれを修正することができ、最終的には2回続けてsizeToFit電話をかけることになりました。sizeToFit

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [_detailsWebView sizeToFit];
    [_detailsWebView sizeToFit];
}

そしてそれは動作します。私はそのような解決策に満足しているとは言えず、それをより良くするために努力していますが、それは機能し、コードは非常に単純です。

于 2012-09-07T16:41:38.670 に答える