6

いくつかのラベルを含むView Controllerと、それにいくつかのhtmlをロードしているUIWebViewがあります。これらすべてのラベルと UIWebView は、UIScrollView のサブビューです。UIWebView のスクロールを無効にしたので、ラベルと UIWebView は UIScrollView 内で一緒にスクロールします。

次に、UiWebView 内のコンテンツのサイズを見つけ、コンテンツのサイズに応じて UIWebView のサイズを変更し、スクロール ビューのサイズを webview のサイズに設定しました。これは、webViewDidFinishLoad に次のコードを追加して行った方法です。

CGRect frame = myWebView.frame;
frame.size.height = 1;
myWebView.frame = frame;
CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
myWebView.frame = frame;

NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);

mainScrollView.contentSize = myWebView.bounds.size; 

NSLog を使用して webview のコンテンツのサイズを確認していると、同じコンテンツの高さが異なることに気付きました。たとえば、View Controller を初めて開いた場合、高さは 915.0 と表示され、ナビゲーションに戻ってこの View Controller に戻ると、ログにはサイズが 1012.0 と表示されます。

htmlコンテンツに画像が読み込まれていることが原因である可能性があります。初めて正しい高さを表示するように修正するにはどうすればよいですか?ありがとう!

更新: javascriptを使用して別の戦略を使用する場合、次のコードを使用して既に試しました:

CGRect oldBounds = [[self myWebView] bounds];
CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
NSLog(@"NEW HEIGHT %f", height);
[myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)];
mainScrollView.contentSize = myWebView.bounds.size;

このコードは、ログで毎回適切な高さを提供しますが、これはまさに私が望むものですが、webview 全体が少し上に移動し、その上のすべてのラベルがブロックされます。私は何か間違ったことをしていますか、それを修正する方法はありますか? ありがとう!

4

3 に答える 3

10

これは、UIScrollView 内に UIWebView およびその他のビューを埋め込もうとするときによくある問題です。

解決策1:質問の最初の解決策については既に説明しました。このソリューションは、UIScrollView 内の UIWebView にテキストのみが含まれている場合にのみ有効です。画像や ajax など、遅延ロードするものがある場合、このソリューションでは最初は適切な高さが得られません。

CGRect frame = myWebView.frame;
frame.size.height = 1;
myWebView.frame = frame;
CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
myWebView.frame = frame;

NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);

mainScrollView.contentSize = myWebView.bounds.size; 

解決策2:もう 1 つの解決策は、javascript を使用することです。毎回適切な高さを提供しますが、トラブルシューティングできない奇妙な問題に直面するでしょう. あなたの場合、全体の見方が少し上にずれているとおっしゃいました。

CGRect oldBounds = [[self myWebView] bounds];
CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
NSLog(@"NEW HEIGHT %f", height);
[myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)];
mainScrollView.contentSize = myWebView.bounds.size;

解決策3:最後の解決策は私のために働いたものであり、間違いなくあなたの問題を解決します。これには、私が説明した最初の 2 つのソリューションのコードをマージすることが含まれます。つまり、javascript を使用して高さを取得し、毎回適切な高さを取得し、最初のソリューションで残りのコードを使用して数ポイントを増やします。+125.0 を追加したことに注意してください。これが解決方法です。

CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
CGFloat width = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue];
CGRect frame = myWebView.frame;
frame.size.height = height + 125.0;
frame.size.width = width;
myWebView.frame = frame;
mainScrollView.contentSize = myWebView.bounds.size;

お役に立てれば!

于 2013-10-30T00:46:38.970 に答える
1

WebView は、すべてのコンテンツを非同期的に読み込みます。

html が読み込まれるまで待つ必要がありますwebViewDidFinishLoading(まだ画像データではありません!)。その後、html のサイズを認識します。動作するsizeToFitはずです。

于 2013-10-23T00:53:39.127 に答える
1

UIWebView はバックグラウンドで読み込まれるため、ページが読み込まれるまで待ってから、高さを把握する必要があります。

ここに 1 つの方法があります: https://stackoverflow.com/a/3937599/210171

ただし、通常は JavaScript 手法を使用します。Web ビュー デリゲートで、次の-webViewDidFinishLoad:ように変更します。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString * heightString = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
    CGFloat contentHeight = [ heightString doubleValue ] ;
    NSLog( @"contentHeight=%f\n", contentHeight ) ;
}

(このコードはhttps://stackoverflow.com/a/751326/210171から取得したものです)

画像にサイズ属性が設定されていない場合、画像が読み込まれるとコンテンツの高さが変化し続ける可能性があります。その場合は、こちらの回答をご覧ください: https://stackoverflow.com/a/12030878/210171

于 2013-10-25T06:00:11.873 に答える