2013-10-22 33 views
6

我有一個視圖控制器包含一些標籤和一個UIWebView加載一些HTML。所有這些標籤和UIWebView都是UIScrollView的子視圖。我禁用了UIWebView的滾動功能,以便標籤和UIWebView在UIScrollView中一起滾動。UIWebView無法完全加載,高度不一

然後,我發現了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的內容的大小,我注意到,它給出了相同內容不同的高度。例如,如果我第一次打開視圖控制器,它將顯示等於915.0的高度,並且當我移回導航並回到此視圖控制器時,日誌將顯示大小爲1012.0。

我認爲這可能是由於html內容中加載的圖像造成的。任何人都可以告訴我如何修復它以便第一次顯示正確的高度?謝謝!

UPDATE:如果我使用了不同的策略使用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會向上移動一些,阻止它上面的所有標籤。我做錯了什麼,如何解決它?謝謝!

+0

你也記錄滾動視圖嗎?這可能會顯示一個有趣的結果。任何xib警告消息? –

+0

和這個問題可能會有所幫助:http://stackoverflow.com/questions/6440448/ios-uiwebview-inside-a-uiscrollview?rq=1或這:http://stackoverflow.com/questions/8089992/contentchange -when-uiwebview-load-inside-scrollview?rq = 1 –

+0

@DavidDelMonte如果我使用NSString * webHeight = [myWebView stringByEvaluatingJavaScriptFromString:@「document.height;」]; NSLog(@「WebView Height%@」,webHeight);那麼它每次都顯示確切的高度,但在這裏webHeight是一個NSString,我如何設置myWebView的高度爲webHeight的高度? – AJ112

回答

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:另一解決方案是使用的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:最後的解決方案是爲我工作的一個,它肯定會解決你的問題。它涉及在我描述的前兩個解決方案中合併代碼。那就是你會使用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; 

希望能幫到你!

+0

就像一個魅力! – AJ112

+1

第三種解決方案有效,但當HTML字符串中包含圖像源時不起作用。 – bluenowhere

1

WebView異步加載其所有內容。

您必須等待webViewDidFinishLoading這樣才能加載html(不是圖像數據!)然後它知道html的大小。有sizeToFit應該工作。

+0

這裏假定imgs(和其他標籤指的是外部資源)有寬度= XY和高度= XY屬性設置! –

+0

可以在你的答案中提供一些代碼,以及如何使用sizeToFit? – AJ112

+0

@ AJ112查看[UIView的文檔](https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instm/的UIView/sizeToFit)。如果你有'UIWebView * webView',你可以調用'[webView sizeToFit]'。 –

1

由於UIWebView在後臺加載,您將不得不等待,直到它加載您的頁面,然後找出高度。

一種方法是: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

+0

一個不同的javascript爲我工作,但仍然是一個問題,請參閱我的問題更新。謝謝!可能是我在得到身高後做錯了事。查看我的更新 – AJ112

+0

你確定你的封閉滾動視圖的位置嗎?嘗試設置'scrollView.backgroundColor = [UIColor redColor]'或類似的東西,這樣你就可以看到它的位置。對你的網頁視圖做同樣的事情:'webView.backgroundColor = [UIColor orangeColor]'... – nielsbot