これは一般的な問題のようですが、適切な解決策を見つけることができません。多数のUIWebViewのサイズを変更してコンテンツに合わせようとしていますが、正しく機能していないようです。私がこれまでに見つけた最良の解決策はこの答えですが、私の解決策ではたまにしか機能しないようです。webViewDidFinishLoad:
アイデアは、 delegateメソッドでUIWebViewのサイズを変更することです。ただし、これでも適切なサイズが得られません。後 の未定義の時間に更新をトリガーするwebViewDidFinishLoad:
と、コンテンツのサイズが正しく設定されます。
以下に私の状況を説明し、関連するソースをGistに貼り付けます。
問題の説明
JSON APIからデータを取得し、そのデータをWebビューに表示している状況があります。APIはオブジェクトの配列を返し、各オブジェクトにはHTML形式のテキストを含む「コンテンツ」フィールドがあります。設計者は、上にスワイプして表示する(ほとんど)非表示のビューを含む構造を提供しました。これには、非常に特殊な方法でフォーマットされたすべてのコンテンツのスクロールビューが含まれます。
これを実装するために、3つのビューコントローラーがあります。メインビューコントローラー、メインビューコントローラーを上にスワイプして表示するセカンダリビューコントローラー、およびJSONAPIの結果からHTML形式のコンテンツの1つのアイテムを表示するターシャリビューコントローラーです。 。
セカンダリビューコントローラには、UIScrollViewとターシャリビューコントローラの配列が含まれています。各ターシャリビューコントローラには、HTML形式のコンテンツを表示するためのUIWebViewと、JSONオブジェクトの他の属性を表示するためのラベルが含まれています。三次ビューは二次ビューのUIScrollView内に表示されるため、三次ビューのUIWebViewは、混乱するスクロールビューのスクロールビューを防ぐために、コンテンツに合わせてサイズを変更し、ユーザー操作を無効にする必要があります。シナリオ。
これらすべてを機能させるためのプロセスは次のとおりです。
- まず、プライマリコントローラーのViewDidLoadで、セカンダリビューとアクティビティインジケーターを読み込んで表示し、UIがフリーズしていないようにします。
- 次に、JSONAPIからデータをロードします
- APIからのデータがロードされたら(デリゲートを介して通知されます)、ターシャリビューコントローラを構築し、ロードされたデータから属性を設定して、セカンダリコントローラのリストに追加します。
- それが終了したら、セカンダリコントローラのセットアップメソッドを呼び出します。このメソッドは、3次コントローラーのリストをループし、それらのセットアップメソッドを順番に呼び出します。
- 各ターシャリコントローラーのセットアップメソッドは、ラベルのテキストを設定し
loadHTMLString:
、JSONオブジェクトのコンテンツをで置き換えた事前定義されたhtmlファイルのコンテンツを使用してUIWebViewのコンテンツを設定します。 - ターシャリコントローラーの
webViewDidFinishLoad:
デリゲートメソッドで、この回答のメソッドを使用して、コンテンツサイズに基づいてWebビューのサイズを変更します。 - Webビューに合わせて、3次コントローラーのビューのサイズを変更し、Webビューの下に表示されるラベルを配置します。
- 次に、ターシャリコントローラはデリゲートメソッドを呼び出して、ロードが終了したことをセカンダリコントローラに通知します。セカンダリコントローラは、そのターシャリコントローラのどれがロードを終了したかを監視します。
- すべてのターシャリコントローラのロードが完了すると、セカンダリコントローラはそのリストをループし、UIScrollViewのコンテンツにターシャリビューを追加し、フレームとコンテンツの高さを調整します。