Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-获取UIWebView的内容大小_Iphone_Objective C_Ios5 - Fatal编程技术网

iPhone-获取UIWebView的内容大小

iPhone-获取UIWebView的内容大小,iphone,objective-c,ios5,Iphone,Objective C,Ios5,我在UIWebView中打开本地Pdf文件,然后尝试调整UIWebView的大小,使WebView高度等于WebView内容高度。我使用这行代码获取WebView内容的高度 - (float) getWebViewContentHeight:(UIWebView *)view { CGRect aFrame = view.frame; aFrame.size.height = [view sizeThatFits:[[UIScreen main

我在UIWebView中打开本地Pdf文件,然后尝试调整UIWebView的大小,使WebView高度等于WebView内容高度。我使用这行代码获取WebView内容的高度

- (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上也能运行吗

1。丑陋的方式

使用JS查询文档属性:

CGSize contentSize = CGSizeMake([[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] floatValue],
                                [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] floatValue]);
2。不那么丑陋的方式

UIWebView
是一个包含内部
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;
    }
}

访问内容有点棘手,但这里我将展示两种方法

1。丑陋的方式

使用JS查询文档属性:

CGSize contentSize = CGSizeMake([[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] floatValue],
                                [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] floatValue]);
2。不那么丑陋的方式

UIWebView
是一个包含内部
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;
    }
}

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;
}
Swift(2.2):

func webViewDidFinishLoad(webView:UIWebView){

}


更新:我发现正如评论中提到的,这似乎没有抓住内容缩水的情况。不确定它是否适用于所有内容和操作系统版本,请尝试一下。

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;
}
Swift(2.2):

func webViewDidFinishLoad(webView:UIWebView){

}


更新:我发现正如评论中提到的,这似乎没有抓住内容缩水的情况。不确定它是否适用于所有内容和操作系统版本,试一试。

请说明您面临的错误或问题。iOS 5中没有sizeThatFits。当我在iOS 4.3中运行上述代码时,它会给出UIWebView内容的确切高度,但当我在iOS 5.0上运行此代码时,它会给出UIWebView的高度,而不是UIWebView内容的高度。请说明您面临的错误或问题当我在iOS 4.3中运行上述代码时,iOS 5中没有提到.sizeThatFits,它给出了UIWebView内容的确切高度,但当我在iOS 5.0上运行此代码时,它给出了UIWebView的高度,而不是UIWebView内容的高度。在第一种情况下,它返回0.0000,在第二种情况下,它返回的是webView的高度,而不是高度网络视图的内容;您是否正在尝试
webScrollView.contentSize
?是webScrollView.contentSize.Height API已更改,您可以使用
[(UIWebView)scrollView]访问
UIWebView
的内部滚动视图,而不是在子视图中循环
webview.scrollview.contentSize始终返回高度,从不返回小于当前高度的高度。您只能得到bigger在第一种情况下,它返回0.0000,在第二种情况下,它返回的是webView的高度,而不是webView内容的高度;您是否正在尝试
webScrollView.contentSize
?是webScrollView.contentSize.Height API已更改,您可以使用
[(UIWebView)scrollView]访问
UIWebView
的内部滚动视图,而不是在子视图中循环
webview.scrollview.contentSize始终返回高度,从不返回小于当前高度的高度。你只能变得更大