3 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個贊
結(jié)果我第一次猜到-sizeThatFits:
并沒有完全錯。它似乎有效,但前提是WebView的幀在發(fā)送之前被設(shè)置為最小大小。-sizeThatFits:
..在此之后,我們可以通過適當(dāng)?shù)某叽鐏砑m正錯誤的幀大小。這聽起來很可怕,但其實(shí)沒那么糟。因?yàn)槲覀儍蓚€幀都是在彼此之后進(jìn)行更改的,所以視圖不會更新,也不會閃爍。
當(dāng)然,我們必須等到內(nèi)容加載之后,所以我們將代碼放入-webViewDidFinishLoad:
委托方法
OBJ-C
-?(void)webViewDidFinishLoad:(UIWebView?*)aWebView?{ ????CGRect?frame?=?aWebView.frame; ????frame.size.height?=?1; ????aWebView.frame?=?frame; ????CGSize?fittingSize?=?[aWebView?sizeThatFits:CGSizeZero]; ????frame.size?=?fittingSize; ????aWebView.frame?=?frame; ????NSLog(@"size:?%f,?%f",?fittingSize.width,?fittingSize.height);}
SWIFT 4.x
func?webViewDidFinishLoad(_?webView:?UIWebView)?{ ????var?frame?=?webView.frame ????frame.size.height?=?1 ????webView.frame?=?frame ????let?fittingSize?=?webView.sizeThatFits(CGSize.init(width:?0,?height:?0)) ????frame.size?=?fittingSize ????webView.frame?=?frame}
我應(yīng)該指出另一種方法使用JavaScript。不確定哪種解決方案效果更好。
兩個討厭的解決方案我更喜歡這個。

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個贊
[webView sizeThatFits:CGSizeZero]
CGSizeZero
此方法的默認(rèn)實(shí)現(xiàn)返回視圖邊界矩形的大小部分。子類可以重寫此方法,以根據(jù)任何子視圖的所需布局返回自定義值。例如,UISwitc對象返回一個固定大小值,該值表示開關(guān)視圖的標(biāo)準(zhǔn)大小,而UIImageView對象返回它當(dāng)前顯示的圖像的大小。
[webView sizeThatFits: ...]
width
webView
sizeThatFits
CGSizeZero
webView.scrollView.scrollEnabled = NO
scrollView
.
webView
width
height
webView
OBJ-C
- (void)webViewDidFinishLoad:(UIWebView *)aWebView{ aWebView.scrollView.scrollEnabled = NO; // Property available in iOS 5.0 and later CGRect frame = aWebView.frame; frame.size.width = 200; // Your desired width here. frame.size.height = 1; // Set the height to a small one. aWebView.frame = frame; // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above). frame.size.height = aWebView.scrollView.contentSize.height; // Get the corresponding height from the webView's embedded scrollView. aWebView.frame = frame; // Set the scrollView contentHeight back to the frame itself.}
SWIFT 4.x
func webViewDidFinishLoad(_ aWebView: UIWebView) { aWebView.scrollView.isScrollEnabled = false var frame = aWebView.frame frame.size.width = 200 frame.size.height = 1 aWebView.frame = frame frame.size.height = aWebView.scrollView.contentSize.height aWebView.frame = frame;}
webView
scrollView
webViews
webViews
webView.scrollView.scrollEnabled = NO
height
contentSize
scrollView
webViews
webView
frame.size.height

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個贊
這個webViewDidFinishLoad
方法可以多次調(diào)用,第一個值由sizeThatFits
只是最終尺寸的一部分。然后不管出于什么原因下一次打電話到sizeThatFits
什么時(shí)候webViewDidFinishLoad
再次觸發(fā)將錯誤地返回與以前相同的值!這將隨機(jī)發(fā)生在相同的內(nèi)容上,就好像是某種并發(fā)問題一樣。也許隨著時(shí)間的推移,這種行為已經(jīng)改變了,因?yàn)槲艺跒閕OS 5構(gòu)建并且發(fā)現(xiàn)sizeToFit
以同樣的方式工作(雖然以前沒有?)
我已經(jīng)決定了這個簡單的解決辦法:
-?(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)?{ ????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????}}
更新:我發(fā)現(xiàn),正如評論中提到的,這似乎沒有抓住內(nèi)容縮水的情況。不確定所有的內(nèi)容和操作系統(tǒng)版本是否正確,試一試。
- 3 回答
- 0 關(guān)注
- 500 瀏覽