webViewDidFinishLoad メソッドは複数回呼び出される場合があり、sizeThatFits によって返される最初の値は、最終的なサイズの一部にすぎません。その後、なんらかの理由で、webViewDidFinishLoad が再び発生したときに sizeThatFits を次に呼び出すと、以前と同じ値が誤って返されます。これは、ある種の並行性の問題であるかのように、同じコンテンツに対してランダムに発生します。私は iOS 5 用にビルドしていて、 sizeToFit がほぼ同じように機能することもわかっているため、この動作は時間の経過とともに変化した可能性があります (以前はそうではありませんでしたが?)
私はこの簡単な解決策に落ち着きました:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
CGFloat height = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
CGFloat width = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue];
CGRect frame = aWebView.frame;
frame.size.height = height;
frame.size.width = width;
aWebView.frame = frame;
}
スウィフト (2.2):
func webViewDidFinishLoad(webView: UIWebView) {
if let heightString = webView.stringByEvaluatingJavaScriptFromString("document.height"),
widthString = webView.stringByEvaluatingJavaScriptFromString("document.width"),
height = Float(heightString),
width = Float(widthString) {
var rect = webView.frame
rect.size.height = CGFloat(height)
rect.size.width = CGFloat(width)
webView.frame = rect
}
}
更新:コメントで述べたように、これはコンテンツが縮小した場合を捉えていないようです。すべてのコンテンツと OS バージョンに当てはまるかどうかはわかりませんが、試してみてください。