起因
公司提出要更改部分界面。其中一個界面是嵌入了一個webView的。要求整個頁面都可以上下滾動,且一個UITextView放在UIWebView下面。
難點(diǎn)
- UIWebView 的滾動要和 整個頁面的滾動保持一致。只能讓整個UIWebView自適應(yīng)實(shí)際內(nèi)容高度。
- 加載的網(wǎng)頁的高度是可以動態(tài)改變的。也就是說網(wǎng)頁加載完成后,網(wǎng)頁高度可變。
分析
- 整體滾動無疑要用UIScrollView。網(wǎng)頁加載完成后,網(wǎng)頁的高度變化時,要更改UIWebView的高度,進(jìn)而影響到UITextView的origin.y和UIScrollView的contentSize。嗯,用autolayout很好解決。
- 網(wǎng)頁的完整高度=document.body.offsetHeight。用stringByEvaluatingJavaScriptFromString:在webViewDidFinishLoad:中獲取。
- 網(wǎng)頁加載完成后的高度改變,用JavaScriptCore監(jiān)聽對應(yīng)的事件。
結(jié)果
- UIWebView自適應(yīng)實(shí)際內(nèi)容高度 :
dispatch_async(dispatch_get_main_queue(), ^{
CGFloat webViewHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
});
這里的webViewHeight 實(shí)際使用時出現(xiàn)了無法完全展示網(wǎng)頁的情況,最終在這個值的基礎(chǔ)上加上100,解決!
- 網(wǎng)頁加載完成后,網(wǎng)頁高度可變 :
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"htmlHeightChangeEvent"] = ^{
//上述獲取高度的方法
dispatch_async(dispatch_get_main_queue(), ^{
CGFloat webViewHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
});
}];
不同步到主線程,會在網(wǎng)頁加載完成后,改變網(wǎng)頁高度時,報(bào)‘警告’,大意是說有可能出現(xiàn)詭異的錯誤。