1

UIWebView でローカル Pdf ファイルを開き、WebView の高さが WebView Content の高さと等しくなるように UIWebview のサイズを調整しようとするよりも、このコード行を使用して WebView Content の高さを取得しています

- (float) getWebViewContentHeight:(UIWebView *)view
{


    CGRect aFrame               = view.frame;

    aFrame.size.height  = [view sizeThatFits:[[UIScreen mainScreen] bounds].size].height;
    view.frame              = aFrame;

    return view.frame.size.height;
} 

このコードは iOS 4.3 では完全に機能しますが、iOS 5.0 では機能しません。webView のコンテンツ サイズを取得する方法や、このコードを iOS 5 でも機能させる方法を教えてください。

4

2 に答える 2

6

コンテンツへのアクセスは少しトリッキーですが、ここでは 2 つの方法を紹介します。

1.醜い方法

JS を使用してドキュメント プロパティをクエリする:

CGSize contentSize = CGSizeMake([[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] floatValue],
                                [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] floatValue]);

2. 見苦しくない方法

UIWebViewinternal を含む複合オブジェクトUIScrollViewです。iOS 5.0 以降では、このスクロール ビューを取得して、そのcontentSizeプロパティを として直接使用することができますwebView.scrollView.contentSize。iOS 4.3 以前との互換性を維持する必要がある場合は、スクロール ビューを取得するために黒魔術を行う必要があります。

UIScrollView* webScrollView = nil;
for ( UIView* subview in [webView subviews] )
{
    if ( [subview isKindOfClass:[UIScrollView class]] )
    {
        webScrollView = (UIScrollView*)subview;
        break;
    }
}
于 2012-04-24T14:21:47.910 に答える
0

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 バージョンに当てはまるかどうかはわかりませんが、試してみてください。

于 2016-04-12T10:08:57.257 に答える